函数 t 申明在外层作用域x中,然后 t 在作用域 y中调用, 函数 t 首先会在自己的函数作用域中寻找变量 tt, 然后在往上层寻找 x的作用域,再找全局作用域
x: {
function t(){
console.log(tt)
}
y:{
let tt=1;
t()
}
//error
}
变量重复申明 全局变量x 和 函数内部变量x 并非同一个值, 而参数作用域中的x 并未使用 var申明,所以他使用的是全局变量x
var x = 1;
function foo(x, y = function() { x = 2; }) {
var x = 3;
y();
console.log(x);
}
foo() // 3
x // 1
函数申明提升是整体提升, 而变量提升的赋值行为是动态的,只有代码执行到那里的时候才会执行。
console.log(a); var a= 1;function a(){} console.log(a)
// a=fn a=1
解读一下 这道经典面试题:
function Foo(){
getName = function(){
alert(1);
};
return this;
}
Foo.getName = function(){
alert(2);
};
Foo.prototype.getName = function(){
alert(3);
};
var getName = function(){
alert(4);
};
function getName(){
alert(5);
}
Foo.getName(); // 2 foo constructor上的getName
getName(); // 4 考点在变量提升和函数提升,原理请看上面那道题
Foo().getName(); // 1 foo 内部的变量getName 没有var申明,所以他是全局变量, foo 返回的this 指向window(非严格模式,严格模式this ==undefined),
getName(); // 1 上个步骤中全局变量getName指向了 foo中的 函数
new Foo.getName(); // 2 constructor上的getName , new命令并不影响
//下面两个输出原理一样: Foo的实例或是实例原型链上寻找 getName (运算符执行顺序需要多记)
new Foo().getName();
new new Foo().getName();