Baseline Widely available
bind()
㯠Function
ã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã½ããã§ãæ°ãã颿°ãçæããå¼ã³åºãæã«ã this
ãã¼ã¯ã¼ããæå®ãããå¤ã«è¨å®ããæå®ããã弿°ã®ä¸¦ã³ããæ°ãã颿°ãå¼ã³åºãããéã«æå®ããããã®ããåã«ãã¦å¼ã³åºãã¾ãã
const module = {
x: 42,
getX: function () {
return this.x;
},
};
const unboundGetX = module.getX;
console.log(unboundGetX()); // ã°ãã¼ãã«ã¹ã³ã¼ãã§é¢æ°ãå¼ã³åºã
// æå¾
ãããåºåçµæ: undefined
const boundGetX = unboundGetX.bind(module);
console.log(boundGetX());
// æå¾
ãããåºåçµæ: 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, /* ãã®ä»ã®å¼æ° */)
ãå¼ã³åºããã¨ã§ããã«ãã¤ã³ããããã¨ãã§ããå¥ã®ãã¤ã³ãæ¸ã¿é¢æ° boundFn2
ã使ããã¾ãããªããªããboundFn2
ã®å¯¾è±¡ã¨ãªã颿° boundFn
ã¯ãã§ã« this
ã¨ãããã¤ã³ãæ¸ã¿é¢æ°ãæã£ã¦ããããã§ããboundFn2
ãå¼ã°ããã¨ã 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
å¤ã¯ç¡è¦ããã¾ãï¼ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ Reflect.construct
ã®å¼æ°ã§è¦ãããããã«ãèªåèªèº«ã§ this
ãç¨æããããã§ãï¼ããã¤ã³ãæ¸ã¿é¢æ°ãç´æ¥æ§ç¯ãããå ´åã代ããã« 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
å¤ãå
ã®ãªãã¸ã§ã¯ãã«ãªãã¨èãã¦ãã¾ããã¨ã§ãï¼ä¾ãã°ããã®ã¡ã½ãããã³ã¼ã«ããã¯é¢æ°ã«ä½¿ãå ´åï¼ã
ç¹ã«é
æ
®ããªããã°ããµã¤ãã¯å
ã®ãªãã¸ã§ã¯ããè¦ããªããªãã¾ãããã®é¢æ°ã«å
ã
ã®ãªãã¸ã§ã¯ãã bind()
ãã¦ãã¤ã³ãæ¸ã¿é¢æ°ãçæããã°ããã®åé¡ããã¡ãã¨è§£æ±ºãããã¨ãã§ãã¾ãã
// æä¸ä½ã® '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
弿°ã¯ globalThis
ã§ã¯ãªã undefined
ã«çµã³ä»ãããã retrieveX()
ã®å¼ã³åºãã¯å¤±æãã¾ãã
ãã®ä¾ã ECMAScript ã¢ã¸ã¥ã¼ã«ã§å®è¡ããã¨ãæä¸ä½ã® this
㯠globalThis
ã§ã¯ãªã undefined
ã«çµã³ä»ãããã¦ããã this.x = 9
ã®ä»£å
¥ã失æãã¾ãã
ããã Node CommonJS ã¢ã¸ã¥ã¼ã«å
ã§å®è¡ããã¨ã峿 ¼ã¢ã¼ããã©ããã«é¢ããããæä¸ä½ã® this
㯠globalThis
ã§ã¯ãªã module.exports
ãæãããã«ãªãã¾ãããããã颿°å
ã§ã¯ããã¤ã³ãããã¦ããªã this
ã®åç
§ã¯ãããã§ãã峿 ¼ã¢ã¼ãã§ãªããã° globalThis
ã峿 ¼ã¢ã¼ããªãã° undefined
ãã¨ããã«ã¼ã«ã«å¾ãã¾ãããããã£ã¦ã峿 ¼ã¢ã¼ãã§ãªãå ´åï¼æ¢å®ï¼ã¯ã retrieveX()
㯠undefined
ãè¿ãã¾ããããã¯ã this.x = 9
ãã getX
ãèªãã§ãããªãã¸ã§ã¯ã (globalThis
) ã¨ã¯ç°ãªããªãã¸ã§ã¯ã (module.exports
) ã«æ¸ãè¾¼ãã§ããããã§ãã
å®éãããã¤ãã®çµã¿è¾¼ã¿ã®ãã¡ã½ãããã¯ãã¤ã³ãæ¸ã¿é¢æ°ãè¿ãã²ãã¿ã¼ã§ãããã¾ããæ³¨ç®ãã¹ãä¾ã¯ 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(`ãããã¯è±ã³ãã ${this.petalCount} æã®ç¶ºéºãªè±ã§ãï¼`);
}
}
const flower = new LateBloomer();
flower.bloom();
// After 1 second, calls '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
ãåç
§ãããã代ããã«ã¯ã©ã¹ã使ç¨ãã¦ããã®å¶éã宿½ããªããã°ãªãã¾ããã
ã¯ã©ã¹ã«å¯¾ã㦠bind()
ã使ç¨ããã¨ããã®ã¯ã©ã¹ã®æå³ã¥ãã¯ã»ã¨ãã©ç¶æããã¾ãããç¾å¨ã®ã¯ã©ã¹ã®ãã¹ã¦ã®éçãªèªåèªèº«ã®ããããã£ã¯å¤±ããã¾ãããããããããã¿ã¤ããã§ã¼ã³ã¯ç¶æãããã®ã§ã親ã¯ã©ã¹ããç¶æ¿ãããéçããããã£ã«ã¢ã¯ã»ã¹ãããã¨ã¯å¯è½ã§ãã
class Base {
static baseProp = "base";
}
class Derived extends Base {
static derivedProp = "derived";
}
const BoundDerived = Derived.bind(null);
console.log(BoundDerived.baseProp); // "base"
console.log(BoundDerived.derivedProp); // undefined
console.log(new BoundDerived() instanceof Derived); // true
ã¡ã½ããã®ã¦ã¼ãã£ãªãã£é¢æ°ã¸ã®å¤æ
bind()
ã¯ç¹å®ã® this
å¤ãå¿
è¦ã¨ããã¡ã½ããããååã® this
弿°ãé常ã®å¼æ°ã¨ãã¦åãå
¥ãããã¬ã¼ã³ãªã¦ã¼ãã£ãªãã£é¢æ°ã«å¤æãããå ´åã«ãå½¹ç«ã¡ã¾ããããã¯ãæ±ç¨çãªã¦ã¼ãã£ãªãã£é¢æ°ã®å使¹æ³ã«ä¼¼ã¦ãã¾ãã array.map(callback)
ãå¼ã³åºã代ããã«ã map(array, callback)
ã使ãã¨ãé
åã§ãªãé
å風ãªãã¸ã§ã¯ãï¼ä¾ãã° arguments
ãªã©ï¼ã§ãã Object.prototype
ã夿´ããã« map
ã使ç¨ã§ããããã«ãªãã¾ãã
ä¾ã¨ãã¦ãArray.prototype.slice()
ãåãä¸ãã¾ãããã®é¢æ°ã¯ãé
åã«ä¼¼ããªãã¸ã§ã¯ããæ¬ç©ã®é
åã¸å¤æããããã«ä½¿ãã¾ããã¾ããæ¬¡ã®ããã«ã·ã§ã¼ãã«ããã使ããã¨ãã¾ãã
const slice = Array.prototype.slice;
// ...
slice.call(arguments);
slice.call
ãä¿åãã¦ãæ®éã®é¢æ°ã¨ãã¦å¼ã³åºããã¨ã¯ã§ããªããã¨ã«æ³¨æãã¦ãã ããããªããªãã call()
ã¡ã½ããã¯ãå¼ã³åºãã¹ã颿°ã§ãã this
ã®å¤ãèªã¿åãããã§ãããã®å ´åã bind()
ã使ç¨ãã¦ã call()
ã« this
ã®å¤ããã¤ã³ããããã¨ãã§ãã¾ãã以ä¸ã®ã³ã¼ãã§ã¯ã slice()
㯠Function.prototype.call()
ã®ãã¤ã³ãçã§ã this
ã®å¤ã¯ Array.prototype.slice()
ã«ãã¤ã³ãããã¾ããããã¯ã追å ã® 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