Baseline Widely available
Function
å®ä¾ç bind()
æ¹æ³å建ä¸ä¸ªæ°å½æ°ï¼å½è°ç¨è¯¥æ°å½æ°æ¶ï¼å®ä¼è°ç¨åå§å½æ°å¹¶å°å
¶ this
å
³é®å设置为ç»å®çå¼ï¼åæ¶ï¼è¿å¯ä»¥ä¼ å
¥ä¸ç³»åæå®çåæ°ï¼è¿äºåæ°ä¼æå
¥å°è°ç¨æ°å½æ°æ¶ä¼ å
¥çåæ°çåé¢ã
const module = {
x: 42,
getX: function () {
return this.x;
},
};
const unboundGetX = module.getX;
console.log(unboundGetX()); // The function gets invoked at the global scope
// Expected output: undefined
const boundGetX = unboundGetX.bind(module);
console.log(boundGetX());
// Expected output: 42
è¯æ³
bind(thisArg)
bind(thisArg, arg1)
bind(thisArg, arg1, arg2)
bind(thisArg, arg1, arg2, /* â¦, */ argN)
åæ°
thisArg
å¨è°ç¨ç»å®å½æ°æ¶ï¼ä½ä¸º this
åæ°ä¼ å
¥ç®æ 彿° func
çå¼ã妿彿°ä¸å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼null
å undefined
ä¼è¢«æ¿æ¢ä¸ºå
¨å±å¯¹è±¡ï¼å¹¶ä¸åå§å¼ä¼è¢«è½¬æ¢ä¸ºå¯¹è±¡ãå¦æä½¿ç¨ new
è¿ç®ç¬¦æé ç»å®å½æ°ï¼å忽ç¥è¯¥å¼ã
arg1, â¦, argN
å¯é
å¨è°ç¨ func
æ¶ï¼æå
¥å°ä¼ å
¥ç»å®å½æ°çåæ°åçåæ°ã
ä½¿ç¨æå®ç this
å¼ååå§åæ°ï¼å¦ææä¾ï¼å建çç»å®å½æ°ç坿¬ã
bind()
彿°å建ä¸ä¸ªæ°çç»å®å½æ°ï¼bound functionï¼ãè°ç¨ç»å®å½æ°é叏伿§è¡å
¶æå
è£
ç彿°ï¼ä¹ç§°ä¸ºç®æ 彿°ï¼target functionï¼ãç»å®å½æ°å°ç»å®æ¶ä¼ å
¥çåæ°ï¼å
æ¬ this
çå¼ååå ä¸ªåæ°ï¼æååå¨ä¸ºå
¶å
é¨ç¶æãè䏿¯å¨å®é
è°ç¨æ¶ä¼ å
¥ãé常æ
åµä¸ï¼ä½ å¯ä»¥å° const boundFn = fn.bind(thisArg, arg1, arg2)
å const boundFn = (...restArgs) => fn.call(thisArg, arg1, arg2, ...restArgs)
æå»ºçç»å®å½æ°çè°ç¨ææè§ä¸ºçæï¼ä½å°±æå»º boundFn
çè¿ç¨èè¨ï¼ä¸æ¯äºè
çæçï¼ã
ç»å®å½æ°å¯ä»¥éè¿è°ç¨ boundFn.bind(thisArg, /* more args */)
è¿ä¸æ¥è¿è¡ç»å®ï¼ä»èå建å¦ä¸ä¸ªç»å®å½æ° boundFn2
ãæ°ç»å®ç thisArg
å¼ä¼è¢«å¿½ç¥ï¼å 为 boundFn2
çç®æ 彿°æ¯ boundFn
ï¼è boundFn
å·²ç»æä¸ä¸ªç»å®ç this
å¼äºãå½è°ç¨ boundFn2
æ¶ï¼å®ä¼è°ç¨ boundFn
ï¼è boundFn
åä¼è°ç¨ fn
ãfn
æç»æ¥æ¶å°çåæ°æé¡ºåºä¸ºï¼boundFn
ç»å®çåæ°ãboundFn2
ç»å®çåæ°ï¼ä»¥å boundFn2
æ¥æ¶å°çåæ°ã
"use strict"; // 鲿¢ `this` 被å°è£
å°å°å
è£
对象ä¸
function log(...args) {
console.log(this, ...args);
}
const boundLog = log.bind("this value", 1, 2);
const boundLog2 = boundLog.bind("new this value", 3, 4);
boundLog2(5, 6); // "this value", 1, 2, 3, 4, 5, 6
å¦æç®æ 彿°æ¯å¯æé çï¼ç»å®å½æ°ä¹å¯ä»¥ä½¿ç¨ new
è¿ç®ç¬¦è¿è¡æé ãè¿æ ·åçææå°±å¥½åç®æ 彿°æ¬èº«è¢«æé 䏿 ·ãåç½®çåæ°ä¼åé叏䏿 ·ä¼ éç»ç®æ 彿°ï¼èæä¾ç this
å¼ä¼è¢«å¿½ç¥ï¼å 为æé 彿°ä¼åå¤èªå·±ç this
ï¼å¦ Reflect.construct
çåæ°æç¤ºï¼ãå¦æç´æ¥æé ç»å®å½æ°ï¼new.target
å°æåç®æ 彿°ï¼ä¹å°±æ¯è¯´ï¼ç»å®å½æ°å¯¹ new.target
æ¯éæçï¼ã
class Base {
constructor(...args) {
console.log(new.target === Base);
console.log(args);
}
}
const BoundBase = Base.bind(null, 1, 2);
new BoundBase(3, 4); // true, [1, 2, 3, 4]
ç¶èï¼ç±äºç»å®å½æ°æ²¡æ prototype
屿§ï¼å®ä¸è½ä½ä¸º extends
çåºç±»ã
class Derived extends class {}.bind(null) {}
// TypeError: Class extends value does not have valid prototype property undefined
å½å°ç»å®å½æ°ç¨ä½ instanceof
è¿ç®ç¬¦å³æä½æ°æ¶ï¼instanceof
ä¼è®¿é®ç»å®å½æ°å
é¨åå¨çç®æ 彿°ï¼å¹¶è¯»åå
¶ prototype
屿§ã
class Base {}
const BoundBase = Base.bind(null, 1, 2);
console.log(new Base() instanceof BoundBase); // true
ç»å®å½æ°å ·æä»¥ä¸å±æ§ï¼
length
ç®æ 彿°ç length
åå»è¢«ç»å®çåæ°ä¸ªæ°ï¼ä¸å
æ¬ thisArg
åæ°ï¼ï¼æå°å¼ä¸º 0ã
name
ç®æ 彿°ç name
åå ä¸ "bound "
åç¼ã
ç»å®å½æ°è¿ä¼ç»§æ¿ç®æ 彿°çååé¾ãç¶èï¼å®ä¸ä¼ç»§æ¿ç®æ 彿°çå ¶ä»èªæå±æ§ï¼ä¾å¦ï¼å¦æç®æ 彿°æ¯ä¸ä¸ªç±»ï¼åä¸ä¼ç»§æ¿å ¶éæå±æ§ï¼ã
ç¤ºä¾ å建ç»å®å½æ°bind()
æç®åçç¨æ³æ¯å建ä¸ä¸ªå½æ°ï¼æ 论å¦ä½è°ç¨ï¼å®é½ä¼ä½¿ç¨ç¹å®ç this
å¼è¿è¡è°ç¨ã
JavaScript æ°æç»å¸¸ç¯çä¸ä¸ªé误æ¯å°ä¸ä¸ªæ¹æ³ä»å¯¹è±¡ä¸æååºæ¥ï¼ç¶ååè°ç¨ï¼å¹¶æææ¹æ³ä¸ç this
æ¯åæ¥çå¯¹è±¡ï¼æ¯å¦å¨åè°ä¸ä¼ å
¥è¿ä¸ªæ¹æ³ï¼ã
ç¶èï¼å¦æä¸åç¹æ®å¤ççè¯ï¼é常ä¼ä¸¢å¤±åå§å¯¹è±¡ã使ç¨è¿ä¸ªå½æ°å ä¸åå§ç对象æ¥å建ä¸ä¸ªç»å®å½æ°ï¼å·§å¦å°è§£å³äºè¿ä¸ªé®é¢ï¼
// 顶级çâthisâç»å®å°âglobalThisâã
this.x = 9;
const module = {
x: 81,
getX() {
return this.x;
},
};
// âgetXâçâthisâåæ°ç»å®å°âmoduleâã
console.log(module.getX()); // 81
const retrieveX = module.getX;
// âretrieveXâçâthisâåæ°å¨éä¸¥æ ¼æ¨¡å¼ä¸ç»å®å°âglobalThisâã
console.log(retrieveX()); // 9
// å建ä¸ä¸ªæ°å½æ°âboundGetXâï¼å¹¶å°âthisâåæ°ç»å®å°âmoduleâã
const boundGetX = retrieveX.bind(module);
console.log(boundGetX()); // 81
夿³¨ï¼ 妿å¨ä¸¥æ ¼æ¨¡å¼ä¸è¿è¡è¿ä¸ªç¤ºä¾ï¼retrieveX
ç this
åæ°ä¼ç»å®å° undefined
è䏿¯ globalThis
ï¼è¿ä¼å¯¼è´ retrieveX()
çè°ç¨å¤±è´¥ã
妿å¨ä¸ä¸ª ECMAScript 模åä¸è¿è¡è¿ä¸ªç¤ºä¾ï¼é¡¶çº§ç this
ä¼ç»å®å° undefined
è䏿¯ globalThis
ï¼å¯¼è´ this.x = 9
èµå¼å¤±è´¥ã
å¦æå¨ Node CommonJS 模åä¸è¿è¡è¿ä¸ªç¤ºä¾ï¼å顶级ç this
ä¼ç»å®å° module.exports
è䏿¯ globalThis
ãç¶èï¼å¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼retrieveX
ç this
ä»ç¶ä¼ç»å®å° globalThis
ï¼èå¨ä¸¥æ ¼æ¨¡å¼ä¸ä¼ç»å®ä¸º undefined
ãå æ¤ï¼å¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼é»è®¤æ
åµä¸ï¼ï¼retrieveX()
è°ç¨ä¼è¿å undefined
, å 为 this.x = 9
ä¼åå
¥çæ¯ä¸ä¸ªä¸åç对象ï¼module.exports
ï¼ï¼è getX
读åçæ¯å¦ä¸ä¸ªå¯¹è±¡ï¼globalThis
ï¼ã
å®é
ä¸ï¼ä¸äºå
ç½®çâæ¹æ³â乿¯è¿åç»å®å½æ°ç getter æ¹æ³ï¼å
¶ä¸ä¸ä¸ªæ¾èçä¾åæ¯ Intl.NumberFormat.prototype.format()
ï¼å½è®¿é®æ¶ï¼å®è¿åä¸ä¸ªç»å®å½æ°ï¼ä½ å¯ä»¥ç´æ¥å°å
¶ä½ä¸ºåè°å½æ°ä¼ éã
bind()
çå¦ä¸ä¸ªç®åç¨æ³æ¯å建ä¸ä¸ªå
·æé¢è®¾åå§åæ°ç彿°ã
è¿äºåæ°ï¼å¦ææçè¯ï¼ä¼è·éæä¾ç this
å¼ï¼å¹¶å¨ä¼ éç»ç®æ 彿°çåæ°å表çå¼å¤´æå
¥ï¼å
¶åæ¯å¨è°ç¨ç»å®å½æ°æ¶ä¼ éçåæ°ã
function list(...args) {
return args;
}
function addArguments(arg1, arg2) {
return arg1 + arg2;
}
console.log(list(1, 2, 3)); // [1, 2, 3]
console.log(addArguments(1, 2)); // 3
// å建ä¸ä¸ªå¸¦æé¢è®¾å坼忰ç彿°
const leadingThirtySevenList = list.bind(null, 37);
// å建ä¸ä¸ªå¸¦æé¢è®¾ç¬¬ä¸ä¸ªåæ°ç彿°ã
const addThirtySeven = addArguments.bind(null, 37);
console.log(leadingThirtySevenList()); // [37]
console.log(leadingThirtySevenList(1, 2, 3)); // [37, 1, 2, 3]
console.log(addThirtySeven(5)); // 42
console.log(addThirtySeven(5, 10)); // 42
//ï¼æåä¸ä¸ªåæ° 10 被忽ç¥ï¼
é
å setTimeout()
å¨é»è®¤æ
åµä¸ï¼å¨ setTimeout()
å
é¨ï¼this
å
³é®åå°è¢«è®¾ç½®ä¸º globalThis
ï¼å¨æµè§å¨ä¸å®æ¯ window
对象ãå½å¤çéè¦å° this
å¼ç¨ç±»å®ä¾çç±»æ¹æ³æ¶ï¼ä½ å¯ä»¥æ¾å¼å°å° this
ç»å®å°åè°å½æ°ï¼ä»¥ä¾¿ä¿æå®ä¾çå¼ç¨ã
class LateBloomer {
constructor() {
this.petalCount = Math.floor(Math.random() * 12) + 1;
}
bloom() {
// å»¶è¿ 1 ç§å宣å¸å¼è±
setTimeout(this.declare.bind(this), 1000);
}
declare() {
console.log(`I am a beautiful flower with ${this.petalCount} petals!`);
}
}
const flower = new LateBloomer();
flower.bloom();
// 1 ç§åè°ç¨âflower.declare()â
ä½ è¿å¯ä»¥ä½¿ç¨ç®å¤´å½æ°æ¥å®ç°æ¤ç®çã
class LateBloomer {
bloom() {
// å»¶è¿ 1 ç§å宣å¸å¼è±
setTimeout(() => this.declare(), 1000);
}
}
ä½ä¸ºæé 彿°ä½¿ç¨çç»å®å½æ°
ç»å®å½æ°èªå¨éç¨äºä¸ new
è¿ç®ç¬¦ä¸èµ·ä½¿ç¨ï¼ä»¥ç¨äºæé ç®æ 彿°åå»ºçæ°å®ä¾ãå½ä½¿ç¨ç»å®å½æ°æ¯ç¨æ¥æé ä¸ä¸ªå¼æ¶ï¼æä¾ç this
ä¼è¢«å¿½ç¥ãç¶èï¼æä¾çåæ°ä»ä¼è¢«æå
¥å°æé 彿°è°ç¨æ¶çåæ°å表ä¹åã
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString = function () {
return `${this.x},${this.y}`;
};
const p = new Point(1, 2);
p.toString();
// '1,2'
// thisArg çå¼å¹¶ä¸éè¦ï¼å 为å®è¢«å¿½ç¥äº
const YAxisPoint = Point.bind(null, 0 /*x*/);
const axisPoint = new YAxisPoint(5);
axisPoint.toString(); // '0,5'
axisPoint instanceof Point; // true
axisPoint instanceof YAxisPoint; // true
new YAxisPoint(17, 42) instanceof Point; // true
请注æï¼ä½ æ ééåä»»ä½ç¹æ®æªæ½æ¥å建ä¸ä¸ªç»å®å½æ°ï¼ä»¥ä¾¿ä¸ new
è¿ç®ç¬¦ä¸èµ·ä½¿ç¨ãnew.target
ãinstanceof
ãthis
çé½å¦é¢æå·¥ä½ï¼å°±å¥½åæé 彿°ä»æªè¢«ç»å®ä¸æ ·ãå¯ä¸çåºå«æ¯å®ä¸è½åç¨äº extends
ã
ç¸åºå°ï¼ä½ æ ééåä»»ä½ç¹æ®æªæ½æ¥å建ä¸ä¸ªç»å®å½æ°ï¼ä½¿å
¶åªè½ä»¥æ®éæ¹å¼è°ç¨ï¼å³ä½¿ä½ æ´å¸æè¦æ±åªè½ä½¿ç¨ new
æ¥è°ç¨ç»å®å½æ°ãå¦æä½ å¨æ²¡æä½¿ç¨ new
çæ
åµä¸è°ç¨å®ï¼ç»å®ç this
å°ä¸å被忽ç¥ã
const emptyObj = {};
const YAxisPoint = Point.bind(emptyObj, 0 /*x*/);
// ä»ç¶å¯ä»¥ä½ä¸ºæ®é彿°è°ç¨
//ï¼å°½ç®¡éå¸¸è¿æ¯ä¸å¯åçï¼
YAxisPoint(13);
// ç°å¨å¯ä»¥ä»å¤é¨è§å¯å¯¹ `this` çä¿®æ¹
console.log(emptyObj); // { x: 0, y: 13 }
å¦æä½ å¸æéå¶ç»å®å½æ°åªè½ä½¿ç¨ new
è°ç¨ï¼æè
åªè½å¨æ²¡æä½¿ç¨ new
çæ
åµä¸è°ç¨ï¼ç®æ 彿°å¿
é¡»å¼ºå¶æ§è¡è¯¥éå¶ï¼ä¾å¦éè¿æ£æ¥ new.target !== undefined
æä½¿ç¨ classã
å¨ç±»ä¸ä½¿ç¨ bind()
ä¼ä¿ç大é¨åç±»çè¯ä¹ï¼åªæ¯å½åç±»çææéæèªæå±æ§ä¼ä¸¢å¤±ãç¶èï¼ç±äºååé¾è¢«ä¿çï¼ä½ ä»ç¶å¯ä»¥è®¿é®ä»ç¶ç±»ç»§æ¿çéæå±æ§ãè¿æå³çç»å®åçç±»å®ä¾ä»ç¶å¯ä»¥äº«åå°ç»§æ¿èªç¶ç±»çéæå±æ§çåè½ã
class Base {
static baseProp = "åºç±»å±æ§";
}
class Derived extends Base {
static derivedProp = "æ´¾çç±»å±æ§";
}
const BoundDerived = Derived.bind(null);
console.log(BoundDerived.baseProp); // "åºç±»å±æ§"
console.log(BoundDerived.derivedProp); // undefined
console.log(new BoundDerived() instanceof Derived); // true
å°æ¹æ³è½¬æ¢ä¸ºå®ç¨å½æ°
bind()
å¨æäºæ
åµä¸ä¹é常æç¨ï¼æ¯å¦å½ä½ æ³å°ä¸ä¸ªéè¦ç¹å® this
å¼çæ¹æ³è½¬æ¢ä¸ºä¸ä¸ªæ®éçå®ç¨å½æ°ï¼è¯¥å½æ°å°ä¹åç this
åæ°ä½ä¸ºæ®éåæ°ä¼ å
¥ãè¿ç±»ä¼¼äºéç¨å®ç¨å½æ°ç工使¹å¼ï¼è䏿¯è°ç¨ array.map(callback)
ï¼ä½ å¯ä»¥ä½¿ç¨ map(array, callback)
ï¼è¿æ ·å¯ä»¥é¿å
ä¿®æ¹ Array.prototype
ï¼å¹¶ä¸å¯ä»¥å¨ä¸æ¯æ°ç»çç±»æ°ç»å¯¹è±¡ï¼æ¯å¦ arguments
ï¼ä¸ä½¿ç¨ map
ã
以 Array.prototype.slice()
为ä¾ï¼ä½ å¯ä»¥ä½¿ç¨å®å°ç±»æ°ç»å¯¹è±¡è½¬æ¢ä¸ºçæ£çæ°ç»ãä½ å¯ä»¥å建ä¸ä¸ªç±»ä¼¼ä¸é¢çå¿«æ·æ¹å¼ï¼
const slice = Array.prototype.slice;
// ...
slice.call(arguments);
请注æï¼ä½ ä¸è½ä¿å slice.call
å¹¶å°å
¶ä½ä¸ºæ®é彿°è°ç¨ï¼å 为 call()
æ¹æ³è¿ä¼è¯»åå
¶åºè¯¥è°ç¨ç彿°ä½ä¸ºå
¶ this
å¼ãå¨è¿ç§æ
åµä¸ï¼ä½ å¯ä»¥ä½¿ç¨ bind()
æ¥ç»å® call()
ç this
å¼ãå¨ä¸é¢ç代ç çæ®µä¸ï¼slice()
æ¯ä¸ä¸ªç»å®äº this
å¼ä¸º Array.prototype.slice()
ç Function.prototype.call()
ççæ¬ãè¿æå³çå¯ä»¥æ¶é¤é¢å¤ç call()
è°ç¨ï¼
// ä¸ä¸ä¸ä¸ªç¤ºä¾ä¸çâsliceâç¸å
const unboundSlice = Array.prototype.slice;
const slice = Function.prototype.call.bind(unboundSlice);
// ...
slice(arguments);
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4