javascript學(xué)習(xí)(2)call&apply&bind&eval用法
在javascript中存在這樣幾種特別有用的函數(shù),能方便我們實(shí)現(xiàn)各種奇技淫巧撤摸。其中,call谊娇、bind辑甜、apply能改變函數(shù)運(yùn)行時(shí)的上下文艾船,或者說動(dòng)態(tài)改變函數(shù)內(nèi)部的this指向的作用疗我,這就給我們使用時(shí)提供了極大的靈活性饮潦。而eval可以將傳入的字符串當(dāng)作JavaScript代碼執(zhí)行扼雏。本文坚嗜,簡單的介紹下其中的用法。
1. call
含義:
Function.prototype.call()
可知它是Function原型的一個(gè)方法诗充,它本身會(huì)調(diào)用另外一個(gè)函數(shù)苍蔬,并接收指定的this值和參數(shù)列表。也可以理解為蝴蜓,call()方法中接收的對(duì)象調(diào)用當(dāng)前對(duì)象所擁有的函數(shù)碟绑,而返回值則是該調(diào)用方法的返回值。
用法:
fun.call(thisObj, arg1, arg2, ...)
以上茎匠,會(huì)將fun的上下文對(duì)象this修改為thisObj格仲,并將可選參數(shù)arg1,arg2等當(dāng)作參數(shù)傳遞給fun函數(shù)诵冒。
示例:
var student = {
name: "張三",
age: 18,
getInfo: function(desc) {
console.log(desc + "," + this.name + "," + this.age);
}
}
var xiaoming = {
name: "小明",
age: 20,
}
student.getInfo.call(xiaoming); // welcome,小明,20
2. apply
Function.prototype.apply()
應(yīng)該說apply方法跟call方法的作用類似凯肋,只是apply接收的參數(shù)是指定的this值和一個(gè)包含多個(gè)參數(shù)的數(shù)組作為參數(shù)列表,而call是接受若干個(gè)參數(shù)的列表汽馋。
用法:
fun.apply(thisObj, [argsArray])
注意侮东,argsArray是一個(gè)數(shù)組或者類數(shù)組對(duì)象午笛。
示例:
var student = {
name: "張三",
age: 18,
getInfo: function(desc) {
console.log(desc + "," + this.name + "," + this.age);
}
}
var xiaoming = {
name: "小明",
age: 20,
}
student.getInfo.apply(xiaoming, ["welcome"]); //welcome,小明,20
3. bind
Function.prototype.bind()
bind方法會(huì)創(chuàng)建一個(gè)新的函數(shù),并將原函數(shù)this的值綁定為當(dāng)前指定的對(duì)象苗桂,返回由指定this值和初始化參數(shù)的原函數(shù)的拷貝药磺。
用法:
fun.bind(thisObj[, arg1[, arg2[, ...]]])
即:將fun函數(shù)的this值指定為thisObj,并將參數(shù)列表arg1煤伟,arg2等傳遞給該函數(shù)所創(chuàng)建的一個(gè)新的函數(shù)癌佩。
示例:
var student = {
name: "張三",
age: 18,
getInfo: function(desc) {
console.log(desc + "," + this.name + "," + this.age);
}
}
var xiaoming = {
name: "小明",
age: 20,
}
var getInfo2 = student.getInfo.bind(xiaoming, "welcome");
getInfo2(); // welcome,小明,20
console.log(getInfo2); // [Function: bound getInfo]
4. eval
eval()函數(shù),是全局對(duì)象的一個(gè)函數(shù)屬性便锨。該函數(shù)接受一個(gè)字符串參數(shù)围辙,并會(huì)當(dāng)作javascript代碼來執(zhí)行,如果接受的不是字符串參數(shù)放案,則原樣返回姚建。
用法:
eval(string)
示例:
console.log(eval("new Date()")); // 2017-12-09T08:45:23.759Z
console.log(eval(false)); // false
以上幾個(gè)是日常開發(fā)可能會(huì)用到的高級(jí)用法,但不限于這些吱殉,這里只是也做了簡單的介紹掸冤,主要是促進(jìn)對(duì)javascript的使用與理解,更多后續(xù)的使用會(huì)陸續(xù)更新友雳。