1. js中apply和Math.max()函数的问题
Function.apply()是JS的一个OOP特性,一般用来模拟继承和扩展this的用途,对于上面这段代码,可以专这样去理解属:
XXX.apply是一个调用函数的方法,其参数为:apply(Function, Args),
Function为要调用的方法,Args是参数列表,当Function为null时,默认为上文,
即
Math.max.apply(null, arr)
可认为是
apply(Math.max, arr)
然后,arr是一个参数列表,对于max方法,其参数是若干个数,即
Math.max(a, b, c, d, ...)
当使用apply时,把所有参数加入到一个数组中,即
arr = [a, b, c, d, ...]
代入到原式,
Math.max.apply(null, [a, b, c, d, ...])
实际上等同于
Math.max(a, b, c, d, ...)
在此处,使用apply的优点是在部分JS引擎中提升性能。
2. 如何理解和熟练运用js中的call及apply
call和apply
obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);
两者作用一致,都是把尺瞎obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj『继承』了obj的属性和方法。绑定后会立即执行函数。
唯一区别是apply接受的是数组参数,call接受的是连续参数。
function add(j, k){
return j+k;
}
function sub(j, k){
return j-k;
}
我们在控制台运行:
add(5,3); //8
add.call(sub, 5, 3); //8
add.apply(sub, [5, 3]); //8
sub(5, 3); //2
sub.call(add, 5, 3); //2
sub.apply(add, [5, 3]); //2
调用原生对象的方法
示例:
var a = {0:1, 1:"yjc", length: 2};
a.slice(); //TypeError: a.slice is not a function
Array.prototype.slice.call(a);//[1, "yjc"]
对象a类似array,但不具备array的slice等方法。使用call绑定,这时候就可以调用slice方法。
实现继承
通过call和apply,我们可以实现对象继承。示例:
var Parent = function(){
this.name = "yjc";
this.age = 22;
}
var child = {};
console.log(child);//Object {} ,空对象
Parent.call(child);
console.log(child); //Object {name: "yjc", age: 22}
以上实现了对象孝尘的继承。
bind的使用
obj.bind(thisObj, arg1, arg2, ...);
把obj绑定到thisObj,这时候thisObj具备了obj的属性和方法。与call和apply不同的是,巧困禅bind绑定后不会立即执行。
同样是add()和sub():
add.bind(sub, 5, 3); //不再返回8
add.bind(sub, 5, 3)(); //8
如果bind的第一个参数是null或者undefined,等于将this绑定到全局对象。
3. 在JS中,call()方法和apply()方法到底该怎么应用
1.apply与call是更改对象的内部指针,即改变对象的this指向的内容;
2.call与apply的第一个参数都是要传入给当版前对象的对象,及权函数内部的this,后面的参数都是传递给当前对象的参数。
4. js数组中的apply什么意思
apply()的作用是指定函数作用域和传参,不是数组专用的
apply(作返闷旁用域对象,参数1,参数罩塌2,参漏橡数n...)
5. Javascript中call和apply的区别与详解
call()方法
用于操作this的函数方法是call(),它可以指定的this值和参数来执行函数。call()的第一个参数指定了函数执行时this的值,其后的所有参数都是需要被传入函数的参数。
apply()方法
apply()是你可以用来操作this的第二个函数方法。apply()的工作方裂者辩式和call()完全一样,但它只能接受两个参数: this 的值和一个数组或者类似数组的对肆缺象,内含需要被传入函数的参数(也就是说你可以把arguments对象作为apply()的第二个参数)。你不需要像使用call()那样一个个指嫌铅定参数,而是可以轻松传递整个数组给apply()。除此之外,call()和apply()表现得完全一样。
bind()方法
改变this的第三个函数方法是bind()。ECMAScript 5中新加的这个方法和之前那两个颇有不同。按惯例,bind()的第一个参数是要传给新函数的this的值。其他所有参数代表需要被永久设置在新函数中的命名参数。你可以在之后继续设置任何非永久参数。
资料来源:
HTML5学堂
决胜前端
6. Js中call和apply的区别和用法是什么
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别。x0dx0a先来看看JS手册中对call的解释:x0dx0acall 方法x0dx0a 调用一个对象的一个方法,以另一个对象替换当前对象。x0dx0acall([thisObj[,arg1[, arg2[, [,.argN]]]]])x0dx0a参数x0dx0athisObjx0dx0a可选项。将被用作当前对象的对象。x0dx0aarg1, arg2, , argNx0dx0a可选项。将被传递方法参数序列。x0dx0a说明x0dx0acall 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。x0dx0a 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。x0dx0a x0dx0a说明白一点其实就是更改对象的内部指针,即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。x0dx0ax0dx0ax0dx0acall函数和apply方法的第一个参数都是要传入给当前对象的对象,及函数内部的this。后面的参数都是传递给当前对象的参数。x0dx0a 运行如下代码:x0dx0ax0dx0a可见分别弹出了func和var。到这里就对call的每个参数的意义有所了解了。x0dx0ax0dx0a 对于apply和call两者在作用上是相同的,但两者在参数上有区别的。x0dx0a对于第一个参数意义都一样,但对第二个参数:x0dx0aapply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从判指仿第二个参数开始)。x0dx0a 如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])x0dx0ax0dx0a同时使用apply的好处是逗祥可以直接将当前函数的arguments对象作为apply的第二个参数传入
7. js中call,apply和bind方法的区别和使用场景
在js中,所有的函复数再被调用制的时候都会默认传入两个参数,一个是this,还有一个是arguments。在默认情况下this都是指当前的调用函数的对象。但是有时候我们需要改变this的指向,也就是说使函数可以被其他对象来调用,那么我们应该怎样做呢?这时候我们就可以使用call,apply和bind方法了。
1.首先搞清楚call,apply和bind方法的来历
在js中所有的函数都是Function的实例,而且对于Function来说,它的原型即Function.prototype中含有很多东西,其中call,apply和bind方法就是Function原型中的方法,所以根据原型的规则,所有的函数都可以使用原型中属性和方法,所以来说,对于所有的函数都可以使用call,apply和bind方法。
简单一句话:call,apply和bind都是Function原型中的方法,而所有的函数都是Function的实例。
8. 如何理解和熟练运用js中的call及apply
书上都有例子,多看弊蚂看,照着打几次,就感觉出来了,
call和apply的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值,也就是把想要运行的代码的作用域拿过来。比如你有一个函数o 但是如果直接执行,因为现在在当期作用域中并没有定义函数o。而是在另外一个函数作用域中定义的,比如
Window.color=“ red“;
var o={color:“blue”};
function sayColor(){
alert(this.color);
}
sayColor();// red
sayColor(this);//咐厅red
sayColor(window);//red
sayColor(o);//blue
他们的区别仅在于接受参数的不同
首先apply()方法接受两个参数一个是在其中运行函数的作用域,另一个是参数数组,其中第二个可以是Array的实例也可以是arguments对象
对于call()方法而言,第一个参数是this值没有变化,变化的是其余参数直接传递给函数。换句话说,在使用call()方法时,传递给函数的参数必租简埋须逐个列举出来
具体可以看JavaScript高级程序设计的116页,网上有pdf版本的下载
9. 在JS中,call()方法和apply()方法到底该怎么应用
1.apply与call是更改对象的内部指针,即改变对象的this指向的内容;
2.call与apply的第一个参数都是要传入给当前对象的对象,及函数内部的this,后面的参数都是传递给当前对象的参数。
10. 关于js中apply的用法,请帮我解释下这个什么意思
call 和apply都可以切换函数执行的上下文。
只不过apply的第二个参数支持数组,而call支持多个参数。
这个语法在红皮书里有讲。