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

資訊專欄INFORMATION COLUMN

第三天 函數(shù)

songze / 773人閱讀

摘要:構(gòu)造函數(shù)需要通過運(yùn)算符調(diào)用并產(chǎn)生一個(gè)新的對象作為其接受者。使用方法定義高階函數(shù)允許使用者給回掉函數(shù)指定接收者。當(dāng)給高階函數(shù)傳遞對象方法時(shí)使用匿名函數(shù)在適當(dāng)?shù)慕邮苷呱险{(diào)用該方法。通常情況下應(yīng)該避免使用函數(shù)對象的方法。

1、函數(shù)調(diào)用,方法調(diào)用及構(gòu)造函數(shù)調(diào)用之間的不同

這部分比較簡單,直接看代碼吧:

function hello() {
    console.log("Hello, World");
}
// 函數(shù)的調(diào)用
hello(); // Hello, World

var obj = {
    welcome: function() {
        console.log("Hello, " + this.name);
    },
    name: "dreamapple"
};
// 方法調(diào)用
obj.welcome(); // Hello, dreamapple

function Student(name, age) {
    this.name = name;
    this.age = age;
    console.log("My name is " + this.name + ", and my age is " + this.age);
}
// 構(gòu)造函數(shù)的調(diào)用
var s = new Student("dreamapple", 23); // My name is dreamapple, and my age is 23

注意

函數(shù)調(diào)用將全局對象(處于嚴(yán)格模式下則為undefined)作為接收者。一般很少使用函數(shù)調(diào)用語法來調(diào)用方法。

方法調(diào)用將被查找方法屬性的對象作為調(diào)用接受者。

構(gòu)造函數(shù)需要通過new運(yùn)算符調(diào)用,并產(chǎn)生一個(gè)新的對象作為其接受者。

2、掌握高階函數(shù)的使用

JavaScript中將函數(shù)作為參數(shù)或返回值的函數(shù)被稱為高階函數(shù),下面介紹一些常用的JS內(nèi)置高階函數(shù)

Array.sort

sort 函數(shù)需要使用者傳入一個(gè)排序規(guī)則,如下:

var arr = [1, 9, 3, 4, 2];
// 返回一個(gè)排序的結(jié)果
var arr1 = arr.sort(function(x, y) {return x>y?1:-1});
console.log(arr1); // [ 1, 2, 3, 4, 9 ]
Array.map

使用 map 可以簡化對數(shù)組的遍歷操作,其參數(shù)為一個(gè)函數(shù),如下:

var arr = [1, 9, 3, 4, 2];
var arr2 = arr.map(function(x) {
    return x * 2 + 1;
});
console.log(arr2); // [ 3, 5, 7, 9, 19 ]

var arr3 = [1.4,1.5,3.2,3.6]
arr3 = arr3.map(Math.ceil)
console.log(arr3)//[2, 2, 4, 4]
call

使用call方法自定義接受者來調(diào)用函數(shù)。

使用call方法可以調(diào)用在給定的對象中不存在的方法。

使用call方法定義高階函數(shù)允許使用者給回掉函數(shù)指定接收者。

// 使用call
var obj1 = {
    sayHello: function(msg) {
        console.log("Hello," + this.name + " " + msg);
    },
    name: "dreamapple"
};

var obj2 = {
    name: "dream"
};


// 第一個(gè)參數(shù)是方法的調(diào)用者,剩余的參數(shù)就是原函數(shù)的參數(shù)
obj1.sayHello.call(obj2, "haha"); // Hello,dream haha

// 高階函數(shù)使用call
function compute(arg) {
    var sum = 0;
    for(var i = 0; i < arg.length; i++) {
        sum += arg[i];
    }
    return sum;
}

function highFunc() {
    return compute.call(null, arguments);
}

console.log(highFunc(1, 2, 3, 4, 5)); // 15

var arr = [1,2,3,4,5];
console.log(highFunc(arr)); // 錯(cuò)誤
arguments 的使用

JavaScript給每個(gè)函數(shù)都隱式地提供了一個(gè)局部變量 arguments

使用隱式的arguments對象實(shí)現(xiàn)可變參數(shù)的函數(shù)。

考慮對可變參數(shù)的函數(shù)提供一個(gè)額外的固定元數(shù)的版本,從而使使用者無需借助apply方法。

// 多參數(shù)函數(shù)
function multArgsFunc() {
      console.log(arguments); //[1, 2, 3, 4, 5]
    var sum = 0;
    for(var i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}

console.log(multArgsFunc(1, 2, 3, 4)); // 10
console.log(multArgsFunc(1, 2, 3, 4, 5)); // 15

注意:

永遠(yuǎn)不要直接修改arguments對象

arguments 是一個(gè)對象,不是數(shù)組,可以通過 [].slice.call(arguments) 將其復(fù)制到一個(gè)真正的數(shù)組中再進(jìn)行操作

當(dāng)使用 arguments 時(shí)當(dāng)心函數(shù)嵌套,通常應(yīng)該使用變量保存 arguments 的引用

apply

使用apply方法指定一個(gè)可計(jì)算的的參數(shù)數(shù)組來調(diào)用可變參數(shù)的函數(shù)。

使用apply方法的第一個(gè)參數(shù)給可變參數(shù)的的方法提供一個(gè)接收者。

注意:
apply的用法和call類似,唯一的區(qū)別在于call不接受參數(shù)數(shù)組,而apply可以接受參數(shù)數(shù)組,即使參數(shù)個(gè)數(shù)固定只有一個(gè)或兩個(gè),使用apply時(shí)也需要將參數(shù)用 [] 包裹起來,例子如下:

 // 使用apply
function compute() {
    var sum = 0;
    for(var i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}

function wrapper(arr) {
    return compute.apply(null, arr); // 給compute函數(shù)傳遞多個(gè)參數(shù)
}

var arr = [1, 2, 3, 4, 5];
console.log(wrapper(arr)); // 15
bind

使用 bind 來提取具有確定接受者的方法

要注意, 提取一個(gè)方法不會(huì)將方法的接受者綁定到該方法的對象上。

當(dāng)給高階函數(shù)傳遞對象方法時(shí),使用匿名函數(shù)在適當(dāng)?shù)慕邮苷呱险{(diào)用該方法。

使用bind方法創(chuàng)建綁定到適當(dāng)接收者的函數(shù)。

調(diào)用 f.bind(someObject) 會(huì)產(chǎn)生一個(gè)新的函數(shù)對象。在這個(gè)新的函數(shù)對象中,this被永久綁定到了bind的第一個(gè)參數(shù)上面,無論后期這個(gè)新的函數(shù)被如何使用。

示例如下:

function f(){
    return this.a;
}

var g = f.bind({a:"jack"});
console.log(g()); // jack

var o = {a:37, f:f, g:g};
console.log(o.f(), o.g()); // 37, jack


function Person(name){
 this.nickname = name;
 this.distractedGreeting = function() {
 
   setTimeout(function(){
     console.log("Hello, my name is " + this.nickname);
   }, 500);
 }
}
 
var alice = new Person("Alice");
alice.distractedGreeting();
//Hello, my name is undefined


function Person(name){
  this.nickname = name;
  this.distractedGreeting = function() {
    setTimeout(function(){
      console.log("Hello, my name is " + this.nickname);
    }.bind(this), 500); // <-- this line!
  }
}
 
var alice = new Person("Alice");
alice.distractedGreeting();
// after 500ms logs "Hello, my name is Alice"


this.x = 9; 
var module = {
  x: 81,
  getX: function() { return this.x; }
};
 
module.getX(); // 81
 
var getX = module.getX;
getX(); // 9, 因?yàn)樵谶@個(gè)例子中,"this"指向全局對象
 
// 創(chuàng)建一個(gè)"this"綁定到module的函數(shù)
var boundGetX = getX.bind(module);
boundGetX(); // 81
3、不要信賴函數(shù)的對象的toString方法

當(dāng)調(diào)用函數(shù)的toString方法時(shí),并沒有要求JavaScript引擎能夠精確地獲取到函數(shù)的源代碼。

由于在不同的引擎下調(diào)用toString方法的結(jié)果可能不同,所以絕對不要信賴函數(shù)源代碼的詳細(xì)細(xì)節(jié)。

toString方法的執(zhí)行結(jié)果并不會(huì)暴露存儲(chǔ)在閉包中的局部變量值。

通常情況下,應(yīng)該避免使用函數(shù)對象的toString方法。

(function(x) {
    return x + 1;
}).toString();
/*
 * 輸出結(jié)果
 * function (x) {
 *  return x + 1;
 * }
 * */

(function(x) {
    return x + 1;
}).bind(10).toString();
/*
 * 由于使用了宿主環(huán)境的內(nèi)置庫提供的函數(shù),JavaScript引擎會(huì)視圖提供該函數(shù)的源代碼的真實(shí)表示
 * 而宿主環(huán)境中bind通常是其他語言(如C++)提供的是一個(gè)編譯后的函數(shù)
 * function (x) { [native code] }
 * */

(function(x) {
    return function(y) {
        return x + y;
    }
}).bind(20).toString();
/*
 * function () { [native code] }
 * */

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

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

相關(guān)文章

  • vue三天

    摘要:最近是讓給我折騰的做夢都?jí)粢妼憽!!A粞钥砂椿貜?fù)已留暫無留言刪除該寫了返回失敗內(nèi)容時(shí)間戳頂次數(shù)踩次數(shù)失敗 最近是讓json給我折騰的做夢都?jí)粢妼慾son???。。。阿歐~琢磨著我算是明白了吧~我說說看,你們聽聽看~有不同觀點(diǎn)可以給我留言喲~ 接口就是由前后端協(xié)定好異步交互數(shù)據(jù)的方式,使用ajax的形式或者jsonp的形式進(jìn)行傳遞,數(shù)據(jù)格式可以是字符串或者json 這次用到的知識(shí)點(diǎn): v...

    NickZhou 評(píng)論0 收藏0
  • vue三天

    摘要:最近是讓給我折騰的做夢都?jí)粢妼憽!!A粞钥砂椿貜?fù)已留暫無留言刪除該寫了返回失敗內(nèi)容時(shí)間戳頂次數(shù)踩次數(shù)失敗 最近是讓json給我折騰的做夢都?jí)粢妼慾son???。。。阿歐~琢磨著我算是明白了吧~我說說看,你們聽聽看~有不同觀點(diǎn)可以給我留言喲~ 接口就是由前后端協(xié)定好異步交互數(shù)據(jù)的方式,使用ajax的形式或者jsonp的形式進(jìn)行傳遞,數(shù)據(jù)格式可以是字符串或者json 這次用到的知識(shí)點(diǎn): v...

    shiyang6017 評(píng)論0 收藏0
  • 九天學(xué)會(huì)Java,三天,選擇結(jié)構(gòu)

    摘要:選擇結(jié)構(gòu)變量和數(shù)據(jù)類型,賦值和輸出算術(shù)運(yùn)算選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)函數(shù)定義,函數(shù)調(diào)用變量作用域棧,程序運(yùn)行的基石面向?qū)ο螽惓L幚碚Z言提供的公用包上一節(jié)介紹了的算術(shù)運(yùn)算,如加減乘除等,的運(yùn)算規(guī)則跟四則運(yùn)算一樣。 選擇結(jié)構(gòu) 變量和數(shù)據(jù)類型,賦值和輸出 算術(shù)運(yùn)算 選擇結(jié)構(gòu) = 60) { System.out.println(You have passed the exam...

    Java_oldboy 評(píng)論0 收藏0
  • 三天

    摘要:今天遇到了什么問題在想填代碼的時(shí)候挺尷尬的,需求會(huì)翻譯但是代碼本身沒辦法翻譯的,有點(diǎn)難對應(yīng)上。今天學(xué)了什么相關(guān)知識(shí),又是看為主的一天。因?yàn)樵谏锨眠^一點(diǎn),所以看得比較快,權(quán)當(dāng)復(fù)習(xí)。引一個(gè)筆記第三天 2019.3.8 用時(shí):兩小時(shí)。 今天遇到了什么問題? 在MDN想填代碼的時(shí)候挺尷尬的,需求會(huì)翻譯但是代碼本身沒辦法翻譯的,有點(diǎn)難對應(yīng)上。 今天學(xué)了什么? CSS相關(guān)知識(shí),又是看為主的一天。因...

    NotFound 評(píng)論0 收藏0
  • 三天

    摘要:今天遇到了什么問題在想填代碼的時(shí)候挺尷尬的,需求會(huì)翻譯但是代碼本身沒辦法翻譯的,有點(diǎn)難對應(yīng)上。今天學(xué)了什么相關(guān)知識(shí),又是看為主的一天。因?yàn)樵谏锨眠^一點(diǎn),所以看得比較快,權(quán)當(dāng)復(fù)習(xí)。引一個(gè)筆記第三天 2019.3.8 用時(shí):兩小時(shí)。 今天遇到了什么問題? 在MDN想填代碼的時(shí)候挺尷尬的,需求會(huì)翻譯但是代碼本身沒辦法翻譯的,有點(diǎn)難對應(yīng)上。 今天學(xué)了什么? CSS相關(guān)知識(shí),又是看為主的一天。因...

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

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

0條評(píng)論

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