亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

JavaScript的構造函數詞法作用域/作用域鏈(其實我什么都不會系列)

標簽:
JavaScript

下面这个例子是考虑这种情景下:

  • 一个构造函数 内部返回一个相同的构造函数①
  • 这个构造函数的参数是一个函数 构造函数内的最后一行会执行这个参数 而这个参数还有一个参数这个参数是函数 类似于fn(fn(fn()))②
  • 构造函数内设置一个数组 一个私有变量 再加一个构造函数的属性 这样容易跟踪堆栈调用③
  • handle方法的参数是一个函数 而这个函数会将外部构造函数的show作为其参数使用 这时作为参数使用的show的词法作用域就被固定成了初始构造函数的作用域 不管这个handle如何调用 比如在⑤这个位置 通过handle对数组进行push操作 handle的作用域是外部构造函数 所以push的数组也就是外部的callbacks 所以可以看到随后的function(show){show()}函数显示为
      	show函数的作用域 第 1 个构造函数
      	[ 1 ]
      
  • 而紧跟后面的show() 却显示为
      	show函数的作用域 第 2 个构造函数
      	[]
      

因为在内部返回的构造函数的参数 传入了show函数 而这个show函数的作用域是内部的构造函数作用域

  • 再看下面的代码 直接console.log(callbacks) 并没有显示内部构造函数的私有变量(数组) 而是显示了外部构造函数的callbacks 这是作用域的概念 只不过套上了构造函数这么个东西
i = 1;
function A(fn){
	var callbacks = [],
		aa = i;
	A.ii = i++;

	this.then = function(){
		return new A(function(show){
			handle(1,function(show){ show();});
			show();
			// console.log(show);
			console.log(callbacks);
		})
	}
	function handle(sth,fn){
		callbacks.push(sth);
		console.log('handle函数的作用域 第',aa,'个构造函数');
		fn.call(null, show);
	}
	function show(){
		console.log('show函数的作用域 第',aa,'个构造函数');
		console.log(callbacks);
	}
	fn(show);
}

a = new A(function(){});
a.then();

图片描述
①②③④⑤⑥⑦⑧⑨⑩

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消