【问题标题】:Hoisting in javascript在javascript中提升
【发布时间】:2012-11-22 02:23:14
【问题描述】:

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

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

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

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

那为什么它是未定义的?

【问题讨论】:

  • 对于任何回答的人,请注意“setTimeout”之后第一个代码块中的逗号。 +1
  • 我不太清楚你在问什么。 temp 被声明,然后在 setTimeout 被声明和定义之前被初始化为未定义的值 setTimeout。但是定义setTimeout 听起来也是一个非常糟糕的主意,至少在浏览器环境中是这样,因为这是一个已经使用的符号。

标签: javascript hoisting


【解决方案1】:

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

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

被吊到

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

【讨论】:

  • 我怀疑这是怎么回事,但我不确定我是否也能解释清楚。 ;)
【解决方案2】:

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

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

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

medium: what is javascript hoisting

scotch: understand hoisting in javascript

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2015-03-30
    • 2020-09-10
    • 2020-12-08
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多