摘要:的作用是,創(chuàng)建一個(gè)新函數(shù),稱(chēng)為綁定函數(shù)。而這句話(huà)的效果相當(dāng)于下面的代碼對(duì)方法的理解在看別人代碼時(shí),發(fā)現(xiàn)有這么個(gè)寫(xiě)法,這到底是什么意思呢方法可從已有的數(shù)組中返回選定的元素。該方法并不會(huì)修改數(shù)組,而是返回一個(gè)子數(shù)組。
1.document.querySelectorAll賦給其它變量時(shí), 為什么要.bind(document)?
阮一峰的博客提到$的替代方法:
var $ = document.querySelectorAll.bind(document);
回答(1):我的理解是this的指向問(wèn)題。querySelectorAll是document下的一個(gè)方法,附值給select后,select已經(jīng)是window下的一個(gè)屬性,此時(shí),this已經(jīng)不再是document,而window下沒(méi)有querySelectorAll方法,所以會(huì)報(bào)錯(cuò);var select = document.querySelectorAll.bind(document),能保證調(diào)用select()時(shí)this永遠(yuǎn)指向document。
回答(2):這個(gè)問(wèn)題其實(shí)和querySelectorAll沒(méi)什么關(guān)系。document是類(lèi)的一個(gè)實(shí)例,而querySelectorAll是原型鏈上的方法。類(lèi)比到普通的類(lèi)和原型方法就很好理解了吧。
通過(guò)實(shí)例來(lái)運(yùn)行原型鏈上的方法時(shí),解釋器會(huì)自動(dòng)將this指向那個(gè)實(shí)例,但是直接這樣var select = document.querySelectorAll;,你的變量?jī)H僅是指向了原型鏈上的那個(gè)函數(shù),而沒(méi)有綁定this指針,所以你才需要在外面手動(dòng)綁定一下指針。
回答(3):因?yàn)閐ocument.querySelectorAll是通過(guò)document這個(gè)對(duì)象去調(diào)用querySelectorAll的時(shí)候,函數(shù)的環(huán)境變量里this會(huì)指向document,假設(shè)querySelectorAll含有this的操作的話(huà),那么this就會(huì)指代document。
而當(dāng)你執(zhí)行var select = document.querySelectorAll; 的時(shí)候,select所得到的是querySelector這個(gè)引用,但是此時(shí)如果直接通過(guò)select去調(diào)用的話(huà),也就是select("span"); ,由于select(querySelectorAll)直接調(diào)用的話(huà),this會(huì)自動(dòng)指向window,所以就會(huì)出錯(cuò)。
bind的作用是,創(chuàng)建一個(gè)新函數(shù),稱(chēng)為綁定函數(shù)。當(dāng)調(diào)用這個(gè)綁定函數(shù)時(shí),綁定函數(shù)會(huì)以創(chuàng)建它時(shí)傳入 bind()方法的第一個(gè)參數(shù)作為 this,傳入 bind() 方法的第二個(gè)以及以后的參數(shù)。
而這句話(huà)var $ = document.querySelectorAll.bind(document);的效果相當(dāng)于下面的代碼
var $ = function(document) { return function() { return document.querySelectorAll.call(document, arguments); } }2.對(duì)Array.prototype.slice.call()方法的理解
在看別人代碼時(shí),發(fā)現(xiàn)有這么個(gè)寫(xiě)法:[].slice.call(arguments, 0),這到底是什么意思呢?
(1)slice() 方法可從已有的數(shù)組中返回選定的元素。
start:必需。規(guī)定從何處開(kāi)始選取。如果是負(fù)數(shù),那么它規(guī)定從數(shù)組尾部開(kāi)始算起的位置。也就是說(shuō),-1 指最后一個(gè)元素,-2 指倒數(shù)第二個(gè)元素,以此類(lèi)推。
end:可選。規(guī)定從何處結(jié)束選取。該參數(shù)是數(shù)組片斷結(jié)束處的數(shù)組下標(biāo)。如果沒(méi)有指定該參數(shù),那么切分的數(shù)組包含從 start 到數(shù)組結(jié)束的所有元素。如果這個(gè)參數(shù)是負(fù)數(shù),那么它規(guī)定的是從數(shù)組尾部開(kāi)始算起的元素。
返回一個(gè)新的數(shù)組,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素。該方法并不會(huì)修改數(shù)組,而是返回一個(gè)子數(shù)組。
(2)call()和apply()方法都是在特定的作用域中調(diào)用函數(shù),實(shí)際上等于設(shè)置函數(shù)體內(nèi)this對(duì)象的值。apply和call方法的第一個(gè)參數(shù)都是特定的作用域第二個(gè)參數(shù)不同,apply第二個(gè)參數(shù)可以是Array的實(shí)例,也可以是arguments對(duì)象。call方法需要逐個(gè)列出需要傳遞的參數(shù)。
(3)arguments對(duì)象指數(shù)與數(shù)組類(lèi)似(它并不是Array的實(shí)例),但是可以使用方括號(hào)語(yǔ)法訪(fǎng)問(wèn)每一個(gè)元素,使用length來(lái)確定傳遞進(jìn)來(lái)多少個(gè)參數(shù)。
(4)Array.prototype.slice.call()可以理解為:改變數(shù)組的slice方法的作用域,在特定作用域中去調(diào)用slice方法,call()方法的第二個(gè)參數(shù)表示傳遞給slice的參數(shù)即截取數(shù)組的起始位置。
原理:
Array.prototype.slice.call(arguments)能將具有l(wèi)ength屬性的對(duì)象(key值為數(shù)字)轉(zhuǎn)成數(shù)組。[]是Array的示例,所以可以直接使用[].slice()方法。
var obj = {0:"hello",1:"world",length:2}; console.log(Array.prototype.slice.call(obj,0));//["hello", "world"]
沒(méi)有l(wèi)ength屬性的對(duì)象
var obj = {0:"hello",1:"world"};//沒(méi)有l(wèi)ength屬性 console.log(Array.prototype.slice.call(obj,0));//[]
可以借用Array.prototype.slice方法的對(duì)象要滿(mǎn)足一下兩個(gè)條件:
對(duì)象本身要可以存取屬性
對(duì)象的length屬性可讀寫(xiě)
3.在 JavaScript 中, true && expression 總是會(huì)評(píng)估為 expression ,而 false && expression 總是執(zhí)行為 false 。console.log(true && "expression") console.log(false && "expression") 輸出: expression false
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/95464.html
摘要:獲取的對(duì)象范圍方法獲取的是最終應(yīng)用在元素上的所有屬性對(duì)象即使沒(méi)有代碼,也會(huì)把默認(rèn)的祖宗八代都顯示出來(lái)而只能獲取元素屬性中的樣式。因此對(duì)于一個(gè)光禿禿的元素,方法返回對(duì)象中屬性值如果有就是據(jù)我測(cè)試不同環(huán)境結(jié)果可能有差異而就是。 花了很長(zhǎng)時(shí)間整理的前端面試資源,喜歡請(qǐng)大家不要吝嗇star~ 別只收藏,點(diǎn)個(gè)贊,點(diǎn)個(gè)star再走哈~ 持續(xù)更新中……,可以關(guān)注下github 項(xiàng)目地址 https:...
摘要:收集的一些前端面試題從面試題發(fā)現(xiàn)不足,進(jìn)而查漏補(bǔ)缺,比通過(guò)面試更難得及各大互聯(lián)網(wǎng)公司前端筆試面試題篇及各大互聯(lián)網(wǎng)公司前端筆試面試題篇面試題個(gè)和個(gè)經(jīng)典面試題前端開(kāi)發(fā)面試題如何面試前端工程師很重要個(gè)變態(tài)題解析如何通過(guò)餓了么面試輕 收集的一些前端面試題 從面試題發(fā)現(xiàn)不足,進(jìn)而查漏補(bǔ)缺,比通過(guò)面試更難得 1 BAT及各大互聯(lián)網(wǎng)公司2014前端筆試面試題--Html,Css篇 2 BAT...
摘要:收集的一些前端面試題從面試題發(fā)現(xiàn)不足,進(jìn)而查漏補(bǔ)缺,比通過(guò)面試更難得及各大互聯(lián)網(wǎng)公司前端筆試面試題篇及各大互聯(lián)網(wǎng)公司前端筆試面試題篇面試題個(gè)和個(gè)經(jīng)典面試題前端開(kāi)發(fā)面試題如何面試前端工程師很重要個(gè)變態(tài)題解析如何通過(guò)餓了么面試輕 收集的一些前端面試題 從面試題發(fā)現(xiàn)不足,進(jìn)而查漏補(bǔ)缺,比通過(guò)面試更難得 1 BAT及各大互聯(lián)網(wǎng)公司2014前端筆試面試題--Html,Css篇 2 BAT...
摘要:面試的心得體會(huì)簡(jiǎn)歷制作我做了兩份簡(jiǎn)歷,用兩個(gè)手機(jī)賬號(hào),兩個(gè)簡(jiǎn)歷名字,分別在各個(gè)招聘網(wǎng)站投了雙份簡(jiǎn)歷,一個(gè)是數(shù)據(jù)分析的簡(jiǎn)歷一個(gè)是全棧開(kāi)發(fā)的簡(jiǎn)歷,我真正接觸快年,不管是學(xué)習(xí)還是工作學(xué)到的東西,這兩年大概掌握了前端爬蟲(chóng)數(shù)據(jù)分析機(jī)器學(xué)習(xí)技術(shù), showImg(https://upload-images.jianshu.io/upload_images/13090773-b96aac7e974c...
摘要:背景個(gè)人背景就讀于東北某普通二本院校計(jì)算機(jī)軟件工程專(zhuān)業(yè),現(xiàn)大四,北京實(shí)習(xí)前端方向,自學(xué),技術(shù)棧時(shí)間背景大概是在月日準(zhǔn)備好簡(jiǎn)歷開(kāi)始投遞秋招差不多已經(jīng)結(jié)束招聘崗位不多,投遞對(duì)象為大一些的互聯(lián)網(wǎng)公司事件背景第一個(gè)入職的是好未來(lái)的前端實(shí)習(xí)崗,待遇工 背景 個(gè)人背景 就讀于東北某普通二本院校計(jì)算機(jī)軟件工程專(zhuān)業(yè),現(xiàn)大四,北京實(shí)習(xí) 前端方向,自學(xué),vue技術(shù)棧 時(shí)間背景 大概是在11月9日準(zhǔn)備...
閱讀 2104·2021-11-11 16:54
閱讀 2172·2019-08-30 15:55
閱讀 3668·2019-08-30 15:54
閱讀 452·2019-08-30 15:44
閱讀 2287·2019-08-30 10:58
閱讀 483·2019-08-26 10:30
閱讀 3107·2019-08-23 14:46
閱讀 3309·2019-08-23 13:46