所有javascript大师:为什么会发生这种情况?
为什么该代码:所有javascript大师:为什么会发生这种情况?,javascript,closures,Javascript,Closures,为什么该代码: function answer(x) { function closure() { var x = x || 42; console.log(x); } closure(); } foo(); 是否始终打印42 逻辑是像foo(31337)这样的东西将打印31337,因为在closure中x将是31337,因此x | 42将计算为31337。但事实并非如此 我就是搞不懂这一点,所以我在这里发布这篇文章,希望从一位真正的javascript大师那里得到
function answer(x) {
function closure() {
var x = x || 42;
console.log(x);
}
closure();
}
foo();
是否始终打印42
逻辑是像foo(31337)
这样的东西将打印31337
,因为在closure
中x
将是31337
,因此x | 42
将计算为31337
。但事实并非如此
我就是搞不懂这一点,所以我在这里发布这篇文章,希望从一位真正的javascript大师那里得到启示
function answer(x) {
function closure() {
var x = x || 42;
console.log(x);
}
closure();
}
answer(20);
在闭包内部,将x
定义为局部变量。这意味着它会将参数x
从链上方的应答函数中隐藏起来。由于您使用var语句声明了x
,因此默认为undefined
然后x | | 42
是undefined | | 42
,它是42
这里的问题是,您使用的是相同的名称。如果你做了x=x | | | 42
,那么将x设置为28的就是x=28 | | 42
区别在于使用var
语句创建一个名为x的新函数局部变量。一旦这样做了,就没有办法引用范围链上更高的同名变量
阐明口译员的工作原理。大概是这样的:
function() {
var x = 52;
foo();
function foo() {
...
}
}
转换成
function() {
function foo() {
}
var x;
x = 52;
foo();
}
在闭包内部,将x
定义为局部变量。这意味着它会将参数x
从链上方的应答函数中隐藏起来。由于您使用var语句声明了x
,因此默认为undefined
然后x | | 42
是undefined | | 42
,它是42
这里的问题是,您使用的是相同的名称。如果你做了x=x | | | 42
,那么将x设置为28的就是x=28 | | 42
区别在于使用var
语句创建一个名为x的新函数局部变量。一旦这样做了,就没有办法引用范围链上更高的同名变量
阐明口译员的工作原理。大概是这样的:
function() {
var x = 52;
foo();
function foo() {
...
}
}
转换成
function() {
function foo() {
}
var x;
x = 52;
foo();
}
var x
invar x=x | | 42代码>隐藏参数。
由于var…
总是在函数的开头进行解析,即在执行赋值之前,外部x在函数中永远不可用
这里有一个更好的例子:
(function(x) {
(function() {
alert(x);
var x = 'inside';
})();
})(123);
执行顺序基本上是:
- 使用值
未定义定义定义varx
- 执行
警报(x)
- 将
'inside'
分配给x
var x
在var x=x | | 42代码>隐藏参数。
由于var…
总是在函数的开头进行解析,即在执行赋值之前,外部x在函数中永远不可用
这里有一个更好的例子:
(function(x) {
(function() {
alert(x);
var x = 'inside';
})();
})(123);
执行顺序基本上是:
- 使用值
未定义定义定义varx
- 执行
警报(x)
- 将
'inside'
分配给x
所以你说var x=x | | 42
与var x相同;x=x | | 42
,这意味着在执行(…)
之前,将var x=(…)
x
声明为局部变量。为了澄清所有var
语句,将其提升到范围的顶部。参见edit.so你说var x=x | | 42
与var x相同;x=x | | 42
,这意味着在执行(…)
之前,将var x=(…)
x
声明为局部变量。为了澄清所有var
语句,将其提升到范围的顶部。请参见编辑。