javascript可以在调用者之后定义被调用者,它是如何解析的?

时间:2013-08-27 03:47:36

标签: javascript

我想知道javascript如何做到这一点?可以在调用者调用函数后定义该函数。

是否有任何文件可以详细解释它的工作原理?

由于

2 个答案:

答案 0 :(得分:6)

这是因为函数声明提升。所有函数声明都被提升到包含范围的顶部。函数声明如下:

function functionName(arg1, arg2){
    ..code here
}

这就是你可以在代码中实际声明之前调用该函数的原因。

但请注意,函数表达式不会被挂起。所以没有悬挂:

var functionName = function(arg1, arg2){
    ..code here
};

所以下面会抛出错误:

functionName(); //TypeError, undefined is not a function!
var functionName = function(arg1, arg2) {
    console.log(arg1);
};

<强>添加:: 考虑函数表达式::

的示例
saySomething(); //You get error here
var saySomething = function() {
    console.log("Hi there!");
};

这将无效并抛出错误,因为,变量声明和函数声明被提升,但在上面的函数表达式示例中,它的变量声明和赋值。变量声明被提升,但赋值保持不变。结果就像是:

var saySomething;
saySomething(); //you get error here, which should be clear now as why you get the error
saySomething = function() {
    console.log("Hi there!");
};

答案 1 :(得分:3)

它被称为'吊装'。本文非常好地解释了这一点:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

基本上发生的事情是第一个代码片段被视为第二个代码片段:

a();
function a(){};

变为

var a = function a(){};
a();