0
var myName = 4;

function myName() {
    console.log("xxxx");
}
console.log(typeof myName); //Number

var myNamex;

function myNamex() {
    console.log("xxxx");
}
console.log(typeof myNamex); //function

请参考小提琴 - http://jsfiddle.net/s8a7m1hk/

console.log(typeof myName);

上面的 log 语句记录了不同的值,唯一的区别是变量在一个地方被赋值,而不是在另一个地方。

你能告诉我这两个代码片段是如何分解的,考虑到提升、关闭或任何可以应用的东西。

4

2 回答 2

3

一旦您按照正确的顺序进行吊装,您的问题就很简单了。实际上,您的代码如下所示:

function myName() {
    console.log("xxxx");
}

function myNamex() {
    console.log("xxxx");
}

var myName;
var myNamex;

myName= 4;

console.log(typeof myName); //Number

console.log(typeof myNamex); //function

所有声明(var语句和函数声明)都被提升到顶部。值的分配4不会被提升,所以在声明之后发生,在它myName4记录时也是如此。您永远不会为 分配任何其他值myNamex,因此它不会更改并且仍然是函数。

于 2015-01-31T19:11:25.247 回答
0

规范会告诉你精确的算法。下面context[[Scope]]封闭LexicalEnvironment对象或全局对象的 。

大致是这样的:

context.myName = function myName() { ... }; // From evaluating 1st function statement.
context.myNamex = function myNamex() { ... }; // From evaluating 2nd function statement.

context.myName; // From evaluating var declaration statement myName. Does nothing because property already exists.
context.myNamex; // From evaluating var declaration statement myNamex. Does nothing because property already exists.

context.myName = 4; // Changes the existing property to point to the number instead of the function myName.

console.log(typeof myName); // Number - for reasons that should now be clear.
console.log(typeof myNamex); // function - for reasons that should now be clear.
于 2015-01-31T20:31:01.413 回答