文章目錄
- 一、函數作用域
-
- 1.修改函數的this的指向,并執行這個函數
- 2.修改函數的this的指向,并傳回這個函數
題目來源于牛客網前端專題:
https://www.nowcoder.com/ta/front-end?page=1
https://www.nowcoder.com/ta/js-assessment
一、函數作用域
(結合 bind,call,apply
方法),手動改變this的指向
1.修改函數的this的指向,并執行這個函數
題目描述
将函數 fn 的執行上下文改為 obj,傳回 fn 執行後的值
原題:https://www.nowcoder.com/practice/dfcc28bf243642b795eaf5a2a621acc5?tpId=6&tqId=10985&tPage=2&rp=2&ru=/ta/js-assessment&qru=/ta/js-assessment/question-ranking
如果使用bind,需要将bind以後的函數立即執行
//主要有三種答案。
function alterContext(fn, obj) {
return fn.bind(obj)();//.bind()傳回的是一個函數,是以需要立即執行。 }
function alterContext(fn, obj) {
return fn.call(obj);
}
function alterContext(fn, obj) {
return fn.apply(obj);
}
2.修改函數的this的指向,并傳回這個函數
題目描述
封裝函數 f,使 f 的 this 指向指定的對象
function bindThis(f, oTarget) {
if (f.bind){//判斷是否支援bind方法
return f.bind(oTarget);//傳回bind函數
} else {//不支援bind方法
return function(){//因為call/apply會立即執行,是以要加一個匿名函數,兩層return
return f.call(oTarget,arguments);
}
}
}