求解一道关于js的百度笔试题

var name = "World";
(function () {
  if (typeof name === 'undefined') {
    var name = 'Jack';
    console.log('Goodbye' + name);
  } else {
    console.log('hello ' + name);
  }
})()

输出:GoodbyeJack

阅读 5.4k
12 个回答

变量声明提升: 变量的声明会提升到当前作用域的顶部

你的代码等于

var name = "World";
(function () {
  var name //声明提升
  if (typeof name === 'undefined') {
    name = 'Jack';
    console.log('Goodbye' + name);
  } else {
    console.log('hello ' + name);
  }
})()

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);
  }
})()

clipboard.png
因为在function scope里已经声明了(第5行)一个重名的局部变量name,所以全局变量name被覆盖了。

在自执行函数里面的name会在自执行函数所形成的作用域内覆盖外边的name,所以当执行

typeof name === 'undefined'

的时候nameundefined。后面的事情就顺理成章了。

要理解一个概念叫做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

局部变量和全局变量,var会有声明提升

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

立即执行函数的作用域是独立封闭的。
在其中的name并没有显示地声明,当js运行到name的时候,会去找name的声明,这时发现找不到,即为undefined。

var name = "World";
(function () {
  if (typeof name === 'undefined') {
    name = 'Jack';
    console.log('Goodbye' + name);
  } else {
    console.log('hello ' + name);
  }
})()

输出:hello World

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题