国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入理解JavaScript(三):獲取數(shù)組中的最大值方法(this,apply)

canopus4u / 863人閱讀

摘要:三個(gè)方法的作用,都是改變的指向,只是用法稍微有些區(qū)別什么是既不指向函數(shù)自身,也不指函數(shù)的詞法作用域。它在函數(shù)定義的時(shí)候是確定不了的在函數(shù)被調(diào)用時(shí)才發(fā)生的綁定,也就是說具體指向什么,取決于你是怎么調(diào)用的函數(shù)。

1.排序法

思路:給數(shù)組先排序(由大到小排序),第一項(xiàng)就是最大值

let arr = [1,5,6,7,9,20,40,2,3];
let max1 = arr.sort(function(a,b){
    return b-a;
})[0];
console.log(max1);
2.假設(shè)法

思路:假設(shè)第一個(gè)值是最大值,依次遍歷數(shù)組中后面的每一項(xiàng),和假設(shè)的值進(jìn)行比較,如果比假設(shè)的值要大,把當(dāng)前項(xiàng)賦值給MAX...

let arr = [1,5,6,7,9,20,40,2,3];
let max2 = arr[0];
for(let i = 1; i <= arr.length; i++){
    let item = arr[i];
    item > max2 ? max2 = item : null;
}
console.log(max2);
3.基于Math.max與apply

思路:基于基于Math.max完成和apply特性

let arr = [1,5,6,7,9,20,40,2,3];
console.log(Math.max.apply(null, arr));

這個(gè)是要重點(diǎn)理解的一個(gè)方案,call,apply,bind常常會(huì)被放一起比較
首先,call,apply,bind這三個(gè)方法其實(shí)都是繼承自Function.prototype中的,屬于實(shí)例方法。
三個(gè)方法的作用,都是改變this的指向,只是用法稍微有些區(qū)別

this

什么是this

this 既不指向函數(shù)自身,也不指函數(shù)的詞法作用域。它在函數(shù)定義的時(shí)候是確定不了的,在函數(shù)被調(diào)用時(shí)才發(fā)生的綁定,也就是說this具體指向什么,取決于你是怎么調(diào)用的函數(shù)

怎么判斷this

1.給當(dāng)前元素的某個(gè)事件綁定方法, 當(dāng)事件觸發(fā)方法執(zhí)行的時(shí)候,方法中的THIS是當(dāng)前操作的元素對(duì)象
2.普通函數(shù)執(zhí)行,函數(shù)中的THIS取決于執(zhí)行的主體,誰執(zhí)行的,THIS就是誰(執(zhí)行主體:方法執(zhí)行,看方法名前面是否有“點(diǎn)”,有的話,點(diǎn)前面是誰this就是誰,沒有this是window)
下面看個(gè)例子:
function myFunction(){
    console.log(this===window);
}    
var obj = {
    myFunction(){
        console.log(this===obj);
    }
}
myFunction();//true
obj.myFunction();//true

對(duì)this有了大致了解后,再來看call方法

window.name = "windowName";
let fn = function(){
    console.log(this.name);
}
let obj = {
    name:"objName"
}
let obj1 = {
    name:"obj1Name"
}
fn();//windowName
fn.call(obj);//objName:雖然是fn調(diào)用,但call改變了this指向,this的指向是obj,故obj.name的值為objName
fn.call(obj1);//obj1Name

call方法執(zhí)行的時(shí)候,內(nèi)部處理了一些事情。首先把要操作函數(shù)中的this關(guān)鍵字變?yōu)閏all方法第一個(gè)傳遞的實(shí)參值,把call方法第二個(gè)及第二個(gè)以后的實(shí)參獲取到,把要操作的函數(shù)執(zhí)行,并且把第二個(gè)以后的傳遞進(jìn)來的實(shí)參傳給函數(shù)

function fn(a, b) {
   console.log(a + b);
}
fn.call(null, 1, 2); //3

CALL中的細(xì)節(jié)

1.非嚴(yán)格模式下,如果參數(shù)不傳,或者第一個(gè)傳遞的是null/undefined,this都指向window
2.在嚴(yán)格模式下,第一個(gè)參數(shù)是誰,this就指向誰(包括null/undefined),不傳this是undefined
在上述代碼中,如果用apply,則是
function fn(a, b) {
   console.log(a + b);
}
fn.apply(null, [1, 2]); //3

apply:和call基本上一模一樣,唯一區(qū)別在于傳參方式

fn.call(obj,10,20)
fn.apply(obj,[10,20]) //APPLY把需要傳遞給FN的參數(shù)放到一個(gè)數(shù)組(或者類數(shù)組)中傳遞進(jìn)去,雖然寫的是一個(gè)數(shù)組,但是也相當(dāng)于給FN一個(gè)個(gè)的傳遞

bind:語法和call一模一樣,唯一的區(qū)別在于立即執(zhí)行還是等待執(zhí)行

fn.call(obj,10,20) 改變FN中的THIS,并且把FN立即執(zhí)行
fn.bind(obj,10,20) 改變FN中的THIS,此時(shí)的FN并沒有執(zhí)行(不兼容IE6~8)

bind調(diào)用之后是返回原函數(shù),需要再調(diào)用一次才行

回到原題,求數(shù)組最大值
Math.max(arr)這樣肯定是報(bào)錯(cuò)的

console.log(Math.max(ary));//=>NaN 
//=>Math.max是獲取一堆數(shù)中的最大值,需要我們把比較的數(shù),一個(gè)個(gè)的傳遞給這個(gè)方法 //=>Math.max(12,13,14...) =>Math.max([12,13,14...])這樣只是傳遞一個(gè)值
Math.max.apply(null,arr);
//=>利用了apply的一個(gè)特征:雖然放的是一個(gè)數(shù)組,但是執(zhí)行方法的時(shí)候,也是把數(shù)組中的每一項(xiàng)一個(gè)個(gè)的傳遞給函數(shù)
4.ES6展開運(yùn)算符
console.log(Math.max(...arr));

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/106627.html

相關(guān)文章

  • 深入理解 Javascriptthis

    摘要:深入淺出的理解問題的由來寫法一寫法二雖然和指向同一個(gè)函數(shù),但是執(zhí)行結(jié)果可能不一樣。該變量由運(yùn)行環(huán)境提供。所以,就出現(xiàn)了,它的設(shè)計(jì)目的就是在函數(shù)體內(nèi)部,指代函數(shù)當(dāng)前的運(yùn)行環(huán)境。 深入淺出this的理解 問題的由來 var obj = { foo: function(){} } var foo = obj.foo; // 寫法一 obj.foo(); // 寫法二 foo...

    OnlyMyRailgun 評(píng)論0 收藏0
  • 【進(jìn)階3-3期】深度解析 call 和 apply 原理、使用場景及實(shí)現(xiàn)

    摘要:之前文章詳細(xì)介紹了的使用,不了解的查看進(jìn)階期。不同的引擎有不同的限制,核心限制在,有些引擎會(huì)拋出異常,有些不拋出異常但丟失多余參數(shù)。存儲(chǔ)的對(duì)象能動(dòng)態(tài)增多和減少,并且可以存儲(chǔ)任何值。這邊采用方法來實(shí)現(xiàn),拼成一個(gè)函數(shù)。 之前文章詳細(xì)介紹了 this 的使用,不了解的查看【進(jìn)階3-1期】。 call() 和 apply() call() 方法調(diào)用一個(gè)函數(shù), 其具有一個(gè)指定的 this 值和分...

    godlong_X 評(píng)論0 收藏0
  • javascript高級(jí)程序設(shè)計(jì)》函數(shù)調(diào)用模式 & this深度理解

    在上一篇文章(《javascript高級(jí)程序設(shè)計(jì)》筆記:Function類型)中稍微提及了一下函數(shù)對(duì)象的屬性—this,在這篇文章中有深入的說明: 函數(shù)的三種簡單調(diào)用模式 1 函數(shù)模式 定義的函數(shù),如果單獨(dú)調(diào)用,不將其與任何對(duì)象關(guān)聯(lián),那么就是函數(shù)調(diào)用模式 function fn(num1, num2) { console.log(this); } // 直接在全局調(diào)用 fn();// w...

    wyk1184 評(píng)論0 收藏0
  • 前端基礎(chǔ):call,apply,bind的的理解

    摘要:和區(qū)別其實(shí)他們的作用是一樣的,只是傳遞的參數(shù)不一樣而已。接受個(gè)參數(shù),第一個(gè)參數(shù)指定了函數(shù)體內(nèi)對(duì)象的指向,第二個(gè)參數(shù)為數(shù)組或者一個(gè)類數(shù)組。看個(gè)栗子一個(gè)有意思的事在中,多次是無效的。而則會(huì)立即執(zhí)行函數(shù)。 背景 前兩天在做小程序的需求的時(shí)候用到bind的時(shí)候才想起自己對(duì)這三的東西的了解比較淺薄,這個(gè)時(shí)候用的時(shí)候就有點(diǎn)怕。時(shí)候還是要好好學(xué)習(xí)下,理解下怎么玩。 正文 先說call 和 apply...

    netmou 評(píng)論0 收藏0
  • JS程序

    摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...

    melody_lql 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<