欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

javascript中bind函數(shù)的使用方法-創(chuàng)新互聯(lián)

JavaScript

十余年的雙鴨山網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整雙鴨山建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“雙鴨山網(wǎng)站設(shè)計”,“雙鴨山網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。

JavaScript(縮寫為JS)是一種高級的、多范式、解釋型的編程語言,是一門基于原型、函數(shù)先行的語言,它支持面向?qū)ο缶幊?、命令式編程以及函?shù)式編程。它提供語法來操控文本、數(shù)組、日期以及正則表達(dá)式,不支持I/O(比如網(wǎng)絡(luò)、存儲和圖形等),但可以由它的宿主環(huán)境提供支持。它已經(jīng)由ECMA(歐洲計算機制造商協(xié)會)通過ECMAScript實現(xiàn)語言的標(biāo)準(zhǔn)化。它被世界上的絕大多數(shù)網(wǎng)站所使用,也被世界主流瀏覽器支持。

bind函數(shù)

bind() 方法會創(chuàng)建一個新函數(shù),當(dāng)這個新函數(shù)被調(diào)用時,它的this值是傳遞給 bind() 的第一個參數(shù), 它的參數(shù)是bind()的其他參數(shù)和其原本的參數(shù)。

語法是這樣樣子的:

fun.bind(thisArg[, arg1[, arg2[, ...]]])

thisArg 當(dāng)綁定函數(shù)被調(diào)用時,該參數(shù)會作為原函數(shù)運行時的 this 指向。當(dāng)使用 new 操作符調(diào)用綁定函數(shù)時,該參數(shù)無效。

arg1, arg2, … (可選)當(dāng)綁定函數(shù)被調(diào)用時,這些參數(shù)加上綁定函數(shù)本身的參數(shù)會按照順序作為原函數(shù)運行時的參數(shù)。

參數(shù)

bind的第一個參數(shù)會作為原函數(shù)運行時的this指向,不多說;而第二個開始的參數(shù)是可選的,當(dāng)綁定函數(shù)被調(diào)用時,這些參數(shù)加上綁定函數(shù)本身的參數(shù)會按照順序作為原函數(shù)運行時的參數(shù)。怎么理解?

function fn(a, b, c) {
  return a + b + c;
}
var _fn = fn.bind(null, 10);
var ans = _fn(20, 30); // 60

fn 函數(shù)需要三個參數(shù),_fn 函數(shù)將 10 作為默認(rèn)的第一個參數(shù),所以只需要傳入兩個參數(shù)即可,如果你不小心傳入了三個參數(shù),放心,也只會取前兩個。

function fn(a, b, c) {
  return a + b + c;
}
var _fn = fn.bind(null, 10);
var ans = _fn(20, 30, 40); // 60

這有啥用呢?如果某些函數(shù),前幾個參數(shù)已經(jīng) “內(nèi)定” 了,我們便可以用 bind 返回一個新的函數(shù)。也就是說,bind() 能使一個函數(shù)擁有預(yù)設(shè)的初始參數(shù)。這些參數(shù)(如果有的話)作為 bind() 的第二個參數(shù)跟在 this 后面,之后它們會被插入到目標(biāo)函數(shù)的參數(shù)列表的開始位置,傳遞給綁定函數(shù)的參數(shù)會跟在它們的后面。

function list() {
  return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
// Create a function with a preset leading argument
var leadingThirtysevenList = list.bind(undefined, 37);
var list2 = leadingThirtysevenList(); // [37]
var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]

new

使用 bind 返回的結(jié)果還是個 function,是個 function 就可以被 new 運算符調(diào)用,那么結(jié)果呢?規(guī)范中說的很清楚了,當(dāng)使用 new 操作符調(diào)用綁定函數(shù)時,bind 的第一個參數(shù)無效。

function Person(name, age) {
  this.name = name;
  this.age = age;
}
var _Person = Person.bind({});
var p = new _Person('hanzichi', 30); // Person {name: "hanzichi", age: 30}

一般我們不會去這么用,但是如果要寫個 bind 的 polyfill( http://caniuse.com/#search=bind ),還是需要考慮用 new 調(diào)用的情況。

我們也可以設(shè)置默認(rèn)值(參考上一小節(jié)),原先提供的那些參數(shù)仍然會被前置到構(gòu)造函數(shù)調(diào)用的前面。

function Person(name, age) {
  this.name = name;
  this.age = age;
}
var _Person = Person.bind(null, 'hanzichi');
var p = new _Person(30); // Person {name: "hanzichi", age: 30}

配合 setTimeout

什么時候容易丟失 this 指向?恩,setTimeout 是一個場景,很容易把 this 指向 window,當(dāng)然,setInterval 也是一樣。當(dāng)使用對象的方法時,需要 this 引用對象,你可能需要顯式地把 this 綁定到回調(diào)函數(shù)以便繼續(xù)使用對象。

var canvas = {
  render: function() {
    this.update();
    this.draw();
  },
  update: function() {
    // ...
  },
  draw: function() {
    // ...
  }
};
window.setInterval(canvas.render, 1000 / 60);

用 canvas 寫特效或者做游戲時經(jīng)常會碰到類似的問題。上面的代碼是有問題的,render 方法中的 this 其實被指向了 window!我們可以用 bind, 顯式地把 this 綁定到回調(diào)函數(shù)以便繼續(xù)使用該對象。

window.setInterval(canvas.render.bind(canvas), 1000);

類似的情況還有 dom 的事件監(jiān)聽,一不小心可能 this 就被指向了 dom 元素。可以參考下以前做 bigrender 時寫的這部分代碼 https://github.com/hanzichi/hanzichi.github.io/blob/master/2016/bigrender/js/bigrender.js#L179-L184 。

tip

bind還能做一些有意思的事情。

通常來說,將一個類數(shù)組轉(zhuǎn)為數(shù)組,我們會用 slice(ie9- 不支持)。參考#14

var slice = Array.prototype.slice;
// slice.apply(arguments);
// slice(arguments, 1);
bind 能讓調(diào)用變的更加簡單。
// same as "slice" in the previous example
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);
// ...
slice(arguments);
// slice(arguments, 1);

再舉個類似的例子,比如說我們要添加事件到多個節(jié)點,for 循環(huán)當(dāng)然沒有任何問題,我們還可以 “剽竊” forEach 方法:

Array.prototype.forEach.call(document.querySelectorAll('input[type="button"]'), function(el){
  el.addEventListener('click', fn);
});

更進(jìn)一步,我們可以用 bind 將函數(shù)封裝的更好:

var unboundForEach = Array.prototype.forEach
  , forEach = Function.prototype.call.bind(unboundForEach);
forEach(document.querySelectorAll('input[type="button"]'), function (el) {
  el.addEventListener('click', fn);
});

同樣類似的,我們可以將 x.y(z) 變成 y(x,z) 的形式:

var obj = {
  num: 10,
  getCount: function() {
    return this.num;
  }
};
var unboundBind = Function.prototype.bind
  , bind = Function.prototype.call.bind(unboundBind);
var getCount = bind(obj.getCount, obj);
console.log(getCount());  // 10

再舉個栗子。每隔一秒在控制臺打印 1-5,看起來是道考察閉包的經(jīng)典題目。

for(var i = 1; i <= 5; i++) {
  !function(i) {
    setTimeout(function() {
      console.log(i);
    }, i * 1000);
  }(i);
}

ES6 下能用 let :

for(let i = 1; i <= 5; i++) {
  setTimeout(function() {
    console.log(i);
  }, i * 1000);
}

也可以用 bind,瞬間逼格提升:

for(var i = 1; i <= 5; i++) {
  setTimeout(console.log.bind(console, i), i * 1000);
}

以上就是javascript里的bind()函數(shù)的詳細(xì)內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!

當(dāng)前名稱:javascript中bind函數(shù)的使用方法-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://aaarwkj.com/article0/dspgoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、品牌網(wǎng)站建設(shè)響應(yīng)式網(wǎng)站、微信公眾號、服務(wù)器托管、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
国产传媒免费在线播放| 男女性情视频免费大全网站| 中文字幕日韩人妻一二三区| 午夜精品人妻一区二区| 欧美+亚洲+精品+三区| 天堂av在线资源观看| 熟女熟妇乱女乱妇综合网| 国产精品一区二区av在线| 亚洲不卡免费在线视频| 精品国产乱码一区二区三区| 欧美激情日韩精品久久久| 国产精品一区二区av在线| 午夜在线成人免费观看| 97久久久人妻精品一区| 国产精品妇女一二三区| 亚洲熟女av综合网丁香| 日韩av在线观看大全| 国产又粗又长又猛又爽视频| 日韩精品毛片精品一区到三区| 亚洲成年人黄色小说网站| 青草草在线观看视频| 国产黄片大秀在线观看| 国产精品一区二区三区日本| 美女黄色午夜福利网站| 人妻在线中文字幕一区| 97高清视频在线观看| 婷婷综合伊人久久狠狠| 亚洲无综合素人在线观看| 日韩在线欧美在线一区二区| av天堂资源在线播放| 亚洲欧美中文日韩一区| 色婷婷久久综合中文久久| 熟妇女人妻丰满少妇中文| 亚洲精品乱码国产妇女毛片| 国产中文字幕有码视频| 成人三级中文字幕电影| 欧美av一区二区三区四区| 一区二区三区四区四虎| 青青草成人一区二区三区| 手机不卡在线观看av| 日韩人妻中出中文字幕|