在嚴格模式下不推薦使用callee、caller的原因

callee

我們知道,在遞歸函數中可以通過arguments.callee來實現解除函數體內代碼與函數名的耦合狀態,但是這種方法會導致函數體內的this指向的對象被修改;

var global = this;

var sillyFunction = function (recursed) {
 	if (!recursed) {
    	return arguments.callee(true);	
	} 
  	if (this !== global) { 
    	console.log(this); 
  	} else { 
    	console.log("This is the global"); 
  	}
}

sillyFunction();

按照es5中對函數內this的理解,此函數是在window環境下被調用的,按理說,this的打印值應該是window,但是此段函數的執行結果卻是:

這一結果中的this是在使用arguments.callee第二次運行函數被打印的,由於第二次運行函數是在arguments的調用下實現的,其this值變成的arguments。

 

caller

function outer(){
    inner();
    //其他代碼
}

function inner(){
    console.log(inner.caller);//也可以寫爲arguments.callee.caller
}
outer();//會輸出outer函數的源碼

caller的調用可以讓我們窺見源碼,不利於代碼的安全性;

另:【參考】https://www.jianshu.com/p/ec60272c5756

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章