变量作用域 随笔

函数 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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值