2016-02-26 33 views
0

我正在阅读JavaScript简洁地(来自Syncfusion的免费电子书),并且有一个标题为“重定义函数参数”的部分,我不太明白。想知道是否有人可以解释发生了什么事。“通过JavaScript重新定义函数参数”

var foo = false; 
var bar = false; 

var myFunction = function(foo, bar) { 
    arguments[0] = true; 
    bar = true; 
    console.log(arguments[0], bar); 
} 

myFunction(); 

我是函数的参数,不管他们是所谓的印象,在局部范围的变量 - 即使参数名称也是全局范围变量的名称。所以,上面的代码,而不是'定义'的功能参数定义的参数。因为如果在调用该功能后,如果将bar记录到控制台,则它会记录false。所以,是的,我在这里有点困惑。这本书是错误的还是我对参数的名称和变量感到困惑?

+0

可能重复的[JavaScript的变量范围是什么?](http://stackoverflow.com/questions/500431/what-is-the-scope-of-variables-in-javascript) – Hacketo

+0

添加一个控制台line before:'var myFunction = function(foo,bar){ console.log(foo,bar); arguments [0] = true; bar = true; console.log(arguments [0],bar); '你看到了什么? – epascarello

+0

我不明白你的问题。你说*是书本错误*,但你不告诉我们这本书是什么说的。 – 2016-02-26 14:04:36

回答

0

我读通过JavaScript简洁地(从Syncfusion免费的电子书)

请把你一粒盐读的任何东西。该书讨论了严格过时的ECMAScript 3。许多事情仍然是一样的(网络需要向后兼容),但有些已经改变。

作为示例,在ES5严格模式下,使用arguments对象重新指定功能参数不再可行。

我是函数参数的印象,不管它们被称为下,在本地范围变量

是的,这是事实。

即使参数名称也是全局作用域变量的名称。

是的,这叫做阴影。为什么在这个例子中有全局变量会逃避我的把握。

所以,上面的代码,而不是“重新定义”功能参数只是定义参数

是。参数确实定义变量,并且主体中的赋值语句重新赋值(从undefinedtrue)。

-1

定义外foofalse(该变量这条线后从未接触过)

var foo = false; 

定义外barfalse;(该变量这条线后从未接触过)

var bar = false; 

定义myFunction并赋予它作为值的功能。

该函数定义了内部foo和内部bar,它们在函数调用时获取值。

var myFunction = function(foo, bar) { 

重新定义任何的内foo值是true

arguments[0] = true; 

重新定义任何的内bar值是true

bar = true; 

不带参数,其定义内foo和内bar作为undefined登录的内foo值和内bar

console.log(arguments[0], bar); 
} 

呼叫myFunction

myFunction(); 
+0

你说*重新定义内部'foo'的值是true *,但在严格模式下,'arguments [0]'不跟踪'foo'的值,也不跟踪'foo'中的值相应的参数[0]'。 – 2016-02-26 14:03:01

+1

@torazaburo - 问题不在于询问使用严格模式的代码。 – Quentin

+0

好,让我们分开毛发。该问题也没有说明代码是非模块代码。但所有的模块代码都是严格的代码。所以如果我只写一个模块,你描述的行为是不正确的。 – 2016-02-26 14:11:26