var name = "World";
(function () {
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye' + name);
} else {
console.log('hello ' + name);
}
})()
输出:GoodbyeJack
var name = "World";
(function () {
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye' + name);
} else {
console.log('hello ' + name);
}
})()
输出:GoodbyeJack
function内部又声明了namevar name
,所以判断里的name不是外部的name了,而是内部声明的name。因为变量提升,所以在判断的时候,name只声明还没有赋值,所以是undefined。
var name = "World";
(function () {
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye' + name);
} else {
console.log('hello ' + name);
}
})()
var name = "World";
(function () {
var name; //此时name是undefined
if (typeof name === 'undefined') {
name = 'Jack';
console.log('Goodbye' + name);
} else {
console.log('hello ' + name);
}
})()
在自执行函数里面的name
会在自执行函数所形成的作用域内覆盖外边的name
,所以当执行
typeof name === 'undefined'
的时候name
为undefined
。后面的事情就顺理成章了。
要理解一个概念叫做var的变量会自动提升到当前作用域的顶端,所有 ,这段代码等同于下面代码
var name = "World";
(function () {
var name ;
if (typeof name === 'undefined') {
name = 'Jack';
console.log('Goodbye' + name);
} else {
console.log('hello ' + name);
}
})()
所以if判断为true,所以输出goodbyeJack
函数作用域内变量声明提升
var name = "World";
(function () {
var name;
if (typeof name === 'undefined') {
name = 'Jack';
console.log('Goodbye' + name);
} else {
console.log('hello ' + name);
}
})()
故而在自执行函数体内 if判断时 name为undefined
1.首先,匿名函数跟闭包没有半毛钱关系。
2.为什么有人觉得匿名函数跟闭包有联系,完全因为网上的一些题目。
3.题主的代码,只有一个匿名函数自调。并无内外层函数。一些例子看到匿名函数自调行程闭包,那是因为:1,确实有个外层和明显的函数如function字样的。2,那是因为for循环也是第一个函数。在for循环里面调用的函数,无论是匿名函数自调,还是写完一个函数马上调用,只有使用了外层函数的变量或参数,就可能形成闭包(前提是外层函数在某个时候被调用了,或者直接for循环进行中)。
所以,题主的题目并没有形成闭包。只是一个单纯的匿名函数自调。
而这道题,到底考什么?
就是考变量的覆盖! 首先name 已经声明过了,还去生命name 就是覆盖了全局变量的name.
如果内部不用var 请看
var name = "World";
(function () {
if (typeof name === 'undefined') {
name = 'Jack';
console.log('Goodbye' + name);
} else {
console.log('hello ' + name);
}
})()//hello world
var name = "World";
(function () {
if (typeof name === 'undefined') {
name = 'Jack';
console.log('Goodbye' + name);
} else {
console.log('hello ' + name);
}
})()
输出:hello World
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
变量声明提升: 变量的声明会提升到当前作用域的顶部
你的代码等于