我之前问过一个问题,有人给了我一个指南,我读了它,我看到了这个
var temp = setTimeout,
setTimeout = function() {};
他说由于 JavaScript 提升,临时将是未定义的,我不明白为什么它不应该是这样的?
var temp;
temp = setTimeout;
setTimeout = function() {};
那么为什么它未定义?
我之前问过一个问题,有人给了我一个指南,我读了它,我看到了这个
var temp = setTimeout,
setTimeout = function() {};
他说由于 JavaScript 提升,临时将是未定义的,我不明白为什么它不应该是这样的?
var temp;
temp = setTimeout;
setTimeout = function() {};
那么为什么它未定义?
这不一样。您的多重var
声明还声明setTimeout
:
var temp = setTimeout,
setTimeout = function() {};
它被吊到
var temp; // = undefined
var setTimeout; // = undefined
temp = setTimeout;
setTimeout = function() {};
使用关键字var声明的变量的范围是它的当前执行上下文。初始化变量时,javascript 引擎默认将变量初始化为undefined。像,
var a; //it initializes to undefined
同样,当您在声明变量之前使用变量时,它现在处于运行上下文中。例如:
console.log(a);
var a=10;
在这种情况下,javascript 引擎以下列方式运行代码,
var a; // a = undefined
console.log(a); //
a =10;
它将变量声明拾取到执行上下文的顶部,而不是其值。这就是你可能已经知道的提升。
在你的情况下:
var temp = setTimeout,
setTimeout = function() {};
从 function(){},假设我们得到 value =10;
现在你的代码看起来像:
var temp = setTimeout,
setTimeout = 10;
但是javascript以下列方式做事,
var temp; // temp = undefined
var setTimeout; // setTimeout = undefined
temp = setTimeout; // here temp is undefined as setTimeout is undefined
setTimeout =10;
它将所有声明的变量保持在堆栈的顶部(不是它的值,而是初始化为未定义)。
如果您想了解更多信息,请访问以下链接: