Javascript:什么时候创建全局

时间:2017-01-09 18:24:17

标签: javascript

在下面的函数中,在什么时候创建全局变量;在执行test()之前还是之后?

var test = function(){
  foo = 5
}

test()

编辑:我指的是foo变量

4 个答案:

答案 0 :(得分:3)

  

..执行test()之前或之后?

这取决于您所指的全局变量,testfoo

test:之前。 var声明被“提升”,它们在执行它们的范围内的任何分步代码之前被处理;全局的代码在该脚本的全局范围内的任何分步代码之前执行。 (后续脚本分别处理,第一个变量,然后是逐步代码。)

对于foo:期间。

该代码的顺序是:

  1. 声明发生:
    1. 使用值test创建全局undefined
  2. 逐步执行:
    1. 执行作业test = function() { foo = 5 }
      1. 创建了该功能
      2. 已分配给test
    2. test()已执行
      1. 分配foo = 5已完成,创建了一个名为foo隐式全局(我的博客上更多内容:The Horror of Implicit Globals

答案 1 :(得分:2)

当解释器尝试分配变量foo时,将创建变量foo,因此在函数执行期间。

var test = function(){
  foo = 5
}

window.hasOwnProperty('foo'); // false

test()

window.hasOwnProperty('foo'); // true

答案 2 :(得分:2)

这很容易测试:

// The code within the function won't be evaluated (nor any variables within it be hoisted)
// until that code is invoked
var test = function(){
  foo = 5;
}

// This will fail saying that foo is undefined, so we know that the global 
// hasn't been created yet
//console.log(foo);

// Call the function and force the code within it to be evaluated
test()

// Works. The global has been created..
console.log(foo);

答案 3 :(得分:0)

在您的代码中

 var test = function(){  foo = 5};   
     test();

test 是保存Function对象的全局变量。它是在全局执行环境中的test()函数调用之前创建的。

foo 也是全局变量,因为没有var,let或const关键字。但它将在调用test()函数后创建。