摘要:和構(gòu)造函數(shù)構(gòu)造函數(shù)可以使用,然后再次創(chuàng)建實(shí)例。提供的值被忽略,提供的那些參數(shù)仍然會(huì)被前置到構(gòu)造函數(shù)調(diào)用的前面。在這種情況下,指向全局作用域。現(xiàn)在將作為的方法來(lái)調(diào)用,傳入這些實(shí)參用于構(gòu)造函數(shù)。
概念
bind() 方法會(huì)返回一個(gè)新函數(shù)(稱為綁定函數(shù)),綁定函數(shù)與原函數(shù)(使用bind()的函數(shù))具有相同的函數(shù)體,但是綁定函數(shù)有新的this值和參數(shù)。
說(shuō)白了,bind()就是創(chuàng)建一個(gè)有著新this和實(shí)參的函數(shù)。
語(yǔ)法:funName.bind(thisArg[, arg1[, arg2[, ...]]])
thisArg
綁定函數(shù)中this的指向。可以是null,undefined,{},或其他任意對(duì)象。可以是另外一個(gè)函數(shù)。該參數(shù)不能被重寫(xiě)。
arg1, arg2, ...
可選。傳給綁定函數(shù)的參數(shù)。
作為默認(rèn)實(shí)參傳遞給綁定函數(shù)。
假設(shè)參數(shù)是一個(gè)列表,現(xiàn)在有2種參數(shù),一個(gè)是bind的實(shí)參參數(shù),一個(gè)新的綁定函數(shù)中傳遞的實(shí)參參數(shù)。bind()的參數(shù)在綁定函數(shù)的參數(shù)的前面。
用法:可以使綁定函數(shù)有初始的默認(rèn)參數(shù)。
例子:
function funa(){ "use strict"; console.log(arguments[0]);//33 console.log(arguments[1]);//11 } var o = { x:1 } var funb = funa.bind(o,33); funb(11);//輸出33 11兼容性:
支持bind()方法的瀏覽器有IE9+。
bind和call、apply的差別bind是ES5新增方法,不會(huì)執(zhí)行對(duì)應(yīng)的函數(shù)(call或apply會(huì)自動(dòng)執(zhí)行對(duì)應(yīng)的函數(shù)),而是返回對(duì)綁定函數(shù)的引用。
call、apply的區(qū)別:接受參數(shù)的方式不一樣。
bind:不立即執(zhí)行。而apply、call 立即執(zhí)行。
bind和構(gòu)造函數(shù)構(gòu)造函數(shù)可以使用bind(),然后再次創(chuàng)建實(shí)例。
bind()提供的 this值被忽略,提供的那些參數(shù)仍然會(huì)被前置到構(gòu)造函數(shù)調(diào)用的前面。
function Point(x, y) { this.x = x; this.y = y; } Point.prototype.toString = function () { return this.x + "," + this.y; }; var p = new Point(1, 2); p.toString(); // "1,2" var YA = Point.bind(null, 0); var axis = new YA(5); axis.toString(); // "0,5" axis instanceof Point; // true axis instanceof YA; // true new Point(17, 42) instanceof YA; // true
例子:
window.color = "red"; var o = { color: "blue" }; function sayColor() { console.log(this.color); } var objectSayColor = sayColor.bind(o); objectSayColor(); //bluebind()應(yīng)用 改變對(duì)象的方法的this
目的:使對(duì)象的方法在不是這個(gè)對(duì)象使用時(shí),this的指向依然是這個(gè)對(duì)象。
原因:創(chuàng)建一個(gè)變量,指向?yàn)閷?duì)象的方法,得到一個(gè)新函數(shù)。這個(gè)新函數(shù)中的this值已經(jīng)不再指向原對(duì)象了。
name = "hello"; var mo = { name:2010, getName:function(){ console.log(this.moyu); } }; mo.getName();//2010 var newMo = mo.getName;//在這種情況下,"this"指向全局作用域window。 newMo();//hello var nextMo = mo.getName.bind(mo); nextMo();//2010設(shè)置默認(rèn)實(shí)參
bind()可以將undefined作為this指向,然后傳入默認(rèn)實(shí)參。
用法:
fun.bind(undefined,33);
function list(){ let res = Array.prototype.slice.call(arguments); console.log(res); } list(1,2,3);//[1,2,3] let newList = list.bind(null,3); newList();//[3] newList(1);//[2,1]配合 setTimeout
在默認(rèn)情況下,使用setTimeout(function,time); 時(shí),函數(shù)的this關(guān)鍵字會(huì)指向window。
在原型上的方法中,this是實(shí)例對(duì)象。使用setTimeout,必須顯式的把實(shí)例對(duì)象綁定到它的函數(shù)中,否則this為window對(duì)象。
function LateBloomer() { this.petalCount = Math.ceil(Math.random() * 12) + 1; } LateBloomer.prototype.declare = function() { console.log("I am a beautiful flower with " + this.petalCount + " petals!"); }; LateBloomer.prototype.bloom = function() { console.log(this);//LateBloomer {patalCount:4}; setTimeout(this.declare.bind(this), 1000); //zxy456:2個(gè)this都是指向LateBloomer. //如果不加bind,setTimeout調(diào)用的函數(shù)的this為window。declare中的this變?yōu)閣indow了。 }; var flower = new LateBloomer(); flower.bloom(); // 一秒鐘后, 調(diào)用"declare"方法ES3版本的bind()方法
zyx456思路:將bind()和函數(shù)的參數(shù)合并。然后運(yùn)行apply即可。
if (!Function.prototype.bind) { Function.prototype.bind = function (o) { var self = this, arg = Array.prototype.slice.call(arguments, 1); var fbind = function () { var arr = [...arg, ...arguments]; // 現(xiàn)在將self作為o的方法來(lái)調(diào)用,傳入這些實(shí)參 return self.apply(o, arr); }; fbind.prototype = this.prototype;//用于bind構(gòu)造函數(shù)。 return fbind; }; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/105906.html
摘要:內(nèi)部的稱為內(nèi)部函數(shù)或閉包函數(shù)。過(guò)度使用閉包會(huì)導(dǎo)致性能下降。,閉包函數(shù)分為定義時(shí),和運(yùn)行時(shí)。循環(huán)會(huì)先運(yùn)行完畢,此時(shí),閉包函數(shù)并沒(méi)有運(yùn)行。閉包只能取得外部函數(shù)中的最后一個(gè)值。事件綁定種的匿名函數(shù)也是閉包函數(shù)。而對(duì)象中的閉包函數(shù),指向。 閉包概念解釋: 閉包(也叫詞法閉包或者函數(shù)閉包)。 在一個(gè)函數(shù)parent內(nèi)聲明另一個(gè)函數(shù)child,形成了嵌套。函數(shù)child使用了函數(shù)parent的參數(shù)...
摘要:箭頭函數(shù)本文字符數(shù),閱讀時(shí)間約分鐘左右。箭頭函數(shù)等于說(shuō),只保留了函數(shù)的參數(shù)和返回。箭頭函數(shù)體內(nèi)的,繼承的是外層代碼塊的。所以,不用用箭頭函數(shù)聲明對(duì)象的方法。不可以使用命令因此箭頭函數(shù)不能用作函數(shù)。 【01】ES6箭頭函數(shù) 本文字符數(shù)4300+,閱讀時(shí)間約8分鐘左右。 【01】箭頭函數(shù) 等于說(shuō),只保留了函數(shù)的參數(shù)和返回。省略function和return。 寫(xiě)法: (形參) => {st...
摘要:本文是重溫基礎(chǔ)系列文章的第十四篇。元,是指程序本身。有理解不到位,還請(qǐng)指點(diǎn),具體詳細(xì)的介紹,可以查看維基百科元編程。攔截,返回一個(gè)布爾值。 本文是 重溫基礎(chǔ) 系列文章的第十四篇。 這是第一個(gè)基礎(chǔ)系列的最后一篇,后面會(huì)開(kāi)始復(fù)習(xí)一些中級(jí)的知識(shí)了,歡迎持續(xù)關(guān)注呀! 接下來(lái)會(huì)統(tǒng)一整理到我的【Cute-JavaScript】的JavaScript基礎(chǔ)系列中。 今日感受:獨(dú)樂(lè)樂(lè)不如眾樂(lè)樂(lè)...
摘要:就稱為部署了遍歷器接口。是一個(gè)函數(shù),調(diào)用它會(huì)生成一個(gè)遍歷器對(duì)象。它的屬性,也是一個(gè)遍歷器對(duì)象生成函數(shù),執(zhí)行后返回它自己。返回遍歷器對(duì)象。下面是一個(gè)無(wú)限運(yùn)行的遍歷器對(duì)象的例子。 『ES6知識(shí)點(diǎn)總結(jié)』遍歷器iterator本文內(nèi)容如下: 1 具有iterator接口的數(shù)據(jù)結(jié)構(gòu) 2 遍歷器過(guò)程 3 遍歷器作用: 4 模擬next()方法 5 使用while循環(huán) 6 TypeScript的寫(xiě)法...
摘要:命令用于規(guī)定本模塊的對(duì)外接口。空格模塊名字符串。其他模塊加載該模塊時(shí),命令可以為該匿名函數(shù)指定任意名字。寫(xiě)法函數(shù)聲明命令用在非匿名函數(shù)前,也是可以的。加載的時(shí)候,視同匿名函數(shù)加載。 本文字符數(shù)8200+,閱讀時(shí)間約16分鐘。 『ES6知識(shí)點(diǎn)總結(jié)』模塊Module 第一節(jié):Module基本概念 【01】過(guò)去使用CommonJS和AMD,前者用于服務(wù)器,后者用于瀏覽器。 Module可以取...
閱讀 2837·2023-04-25 20:02
閱讀 1435·2021-11-11 16:55
閱讀 614·2021-09-26 09:46
閱讀 6205·2021-09-22 15:55
閱讀 1823·2021-08-09 13:41
閱讀 1572·2019-08-30 15:52
閱讀 2372·2019-08-30 14:13
閱讀 3289·2019-08-26 13:48