0
test(); //working

function test(){//do something}

这与(全局)变量对象有关吗?该函数是否在执行过程开始之前推送到变量对象?

更新:好的,我真正的问题是“提升机”是如何工作的。要了解您需要查看javascript 的执行上下文,是的,它与变量对象(它是执行上下文的一部分)有关。

4

2 回答 2

2

请参阅MDN 上的范围备忘单

function foo() { } 自动提升 foo到示波器顶部

这与(全局)变量对象有关吗?该函数是否在执行过程开始之前推送到变量对象?

不,这只是提升。


考虑这个例子:

foo();
// ReferenceError: foo is not defined

(function(){
  foo();
  function foo (){
    console.log("A");
  };
})();
// A

(function(){
  foo();
  function foo (){
    console.log("B");
  };
})();
// B

foo();
// ReferenceError: foo is not defined

提升只是将变量名称“提升”到范围的顶部。


我的意见:

从不把函数写成:

function foo() { ... }

我更喜欢直言不讳,因为魔术行为很糟糕;我总是把函数写成

var foo = function() { ... }

如果我觉得这个函数需要一个名字,我会给它一个名字,但仍然用var

var foo = function foo() { ... }

@bfavaretto提出了一个有效的担忧:

关于您的意见... var foo = function() { ... } 也将 foo 提升到顶部,但具有未定义的值。所以那里也有隐含的东西

诚然,它确实提升foo了一个undefined价值,但一切都会如愿以偿。

foo();
// TypeError: undefined is not a function
// This is good. We don't want the above function to run like that.
// This is a fatal error; the script won't even continue to run as-is.
// Comment out the above line to get it to run.

var foo = function foo() {
  console.log("foo");
};

var foo2 = function foo() {
  console.log("foo2");
};

// Even with the same function name, these two functions will
// output the correct values.
foo();  // foo
foo2(); // foo2

综上所述,在同一范围内拥有两个具有相同名称标识符的函数将是愚蠢的。但是,即使您确实犯了错误并编写了这样的错误代码,如果您使用如上所述的函数表达式,代码仍然可以正常工作。如果您只是使用原始问题中的命名函数,那肯定不会。

于 2013-08-16T17:08:59.027 回答
-1

我想你在这里谈论起吊。我总是更喜欢标记函数而不是函数表达式。

这是一个函数表达式:

//Declaration 1
var foo = function(){

// code goes here
}
  • 本例中的 func 表达式是匿名的,但分配给了 var foo。以供参考

这是一个标记函数:

//Declaration 2
function foo(){
 // same code here
 }
  • 没有任何理由对 var 进行表达式。您应该始终尝试对构造函数使用带标签的语句,这样您就可以通过其构造函数识别对象的“类型”。

  • 人们大多在需要吊装的地方使用它。提升只是意味着在定义之前调用某些东西

    非常非常简单的例子

    foo(); // alerts 'hello'
    function foo() {alert('hello');}
    V/s 
    foo(); // throws an error since foo is undefined
    var foo = function() {alert('hello');}
    

REFER: var functionName = function() {} vs function functionName() {}

于 2013-08-16T17:06:45.797 回答