4

我之前问过一个问题,有人给了我一个指南,我读了它,我看到了这个

  var temp = setTimeout,
  setTimeout = function() {};

他说由于 JavaScript 提升,临时将是未定义的,我不明白为什么它不应该是这样的?

    var temp;
    temp = setTimeout;
    setTimeout = function() {};

那么为什么它未定义?

4

2 回答 2

5

这不一样。您的多重var声明还声明setTimeout

var temp = setTimeout,
    setTimeout = function() {};

它被吊到

var temp; // = undefined
var setTimeout; // = undefined
temp = setTimeout;
setTimeout = function() {};
于 2012-11-22T02:29:45.683 回答
0

使用关键字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;

它将所有声明的变量保持在堆栈的顶部(不是它的值,而是初始化为未定义)。

如果您想了解更多信息,请访问以下链接:

中:什么是javascript提升

苏格兰人:了解javascript中的提升

于 2020-04-06T03:04:33.863 回答