百度经典面试题
下面代码输出结果是什么?
function bar() {
console.log(myName)
}
function foo() {
var myName = " 百度 "
bar()
}
var myName = " 腾讯"
foo()
答案是:腾讯
这里考察了JavaScript的作用域链的知识
1、函数执行上下文是函数声明的上下文,不是执行时刻的上下文,因此br()函数执行的变量myName 上下文是腾讯,而不是执行的foo()函数内部的变量
2、foo 和 bar 的上级作用域都是全局作用域,所以如果 foo 或者 bar 函数使用了一个它们没有定义的变量,那么它们会到全局作用域去查找。也就是说,词法作用域是代码阶段就决定好的,和函数是怎么调用的没有关系
小伙子最后总结一下:一个函数执行的上下文不是在其执行阶段的,而是在声明阶段的上下文,使用变量也是声明阶段的;如果函数有传入变量则用传入变量,没有则用声明阶段上下文变量