在javascript中提升

时间:2012-11-22 02:23:15

标签: javascript hoisting

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

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

他说由于JavaScript提升,temp将不确定,我不明白为什么 它不应该是那样的吗?

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

为什么它未定义?

2 个答案:

答案 0 :(得分:5)

这不一样。您的multiple var declaration也声明setTimeout

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

被提升到

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

答案 1 :(得分: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(){},假设我们得到的值= 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;

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

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

medium: what is javascript hoisting

scotch: understand hoisting in javascript