函数对象的apply()和call()方法

  每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,特定的作用域为this参数指定的对象。

  apply()和call()真正强大的地方是能够扩充函数赖以运行的作用域。下面来看一个例子:

window.color = "red";
var o = {color: "blue"};

function sayColor() {
    alert(this.color);
}

sayColor();                      // red
sayColor.call(this);             // red
sayColor.call(window);           // red
sayColor.call(o);                // blue

  sayColor()作为全局函数定义,而且当在全局作用域中调用它时,它确实会显示“red”——因为对this.color的求值会转换成window.color的求值。而sayColor.call(this)和sayColor.call(window),则是两种显式地在全局作用域中调用函数的方式,结果当然都会显示“red”。

  但是,但运行sayColor.call(o)时,函数的执行环境就不一样了,因为此时函数体内的this对象指向了o,于是结果显示的是“blue”。

  使用call()或apply()来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。

时间: 2024-10-31 20:55:43

函数对象的apply()和call()方法的相关文章

重写函数对象prototype属性值的不同的情况下实例对象的内部属性Prototype值有所不同

http://www.cnblogs.com/cmptlgg/ 我的博客园 重写函数对象的prototype属性值:会切断实例的[[Prototype]]内部属性和最初函数对象的prototype(原型对象)的联系 这个例子引用js高级第三版: /* 这是高三对此实现的解释. 尽管可以随时为原型添加属性和方法,并且修改能够立即在所有对象实例中反映出来,但如果是重 写整个原型对象,那么情况就不一样了.我们知道,调用构造函数时会为实例添加一个指向最初原型的 [[Prototype]]指针,而把原型修

【C++】C++中的lambda表达式和函数对象

目录结构: contents structure [-] lambda表达式 lambda c++14新特性 lambda捕捉表达式 泛型lambda表达式 函数对象 函数适配器 绑定器(binder) std::mem_fn()适配器 lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象,并且使代码更可读.但是从本质上来讲,lambda表达式只是一种语法糖,因为所有其能完成的工作都可以用其它稍微复杂的代码来实现.但是它简便

函数对象的call()、apply() 方法区别

函数对象的call().apply() 方法 函数作为对象提供了call(),apply() 方法,他们也可以用来调用函数,这两个方法都接受一个对象作为参数,用来指定本次调用时函数中this的指向: call()方法 call方法使用的语法规则 函数名称.call(obj,arg1,arg2...argN); 参数说明: obj:函数内this要指向的对象, arg1,arg2...argN :参数列表,参数与参数之间使用一个逗号隔开 var lisi = {names:'lisi'}; var

[Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+1}" 反射获取函数源代码的功能很强大,使用函数对象的toString方法有严重的局限性.toString方法的局限性ECMAScript标准对函数对象的toString方法的返回结果(即该字符串)并没有任何要求.这意味着不同的js引擎将产生不同的字符串,甚至产生的字符串与该函数并不相关. 如果函数

javascript 中 apply(或call)方法的用途----对象的继承

一直以来,我的理解就是  js中的Function.apply(或者是Function.call)方法是来改变Function 这个函数的执行上下文(excute Context),说白了,就是改变执行时函数所处的作用域, 最直接的就是影响到 this 这个预定义的变量的值.!!Function.apply(obj, arguments),就是改变 function 的执行环境为 传入的obj 对象,即 Funtion 内部的this 会被改变为 obj. 下面的这个例子是搜索别人的例子的. 先

JQuery调用iframe子页面函数/对象的方法例子

父页面有个ID为mainfrm.name为Iframe1的iframe,iframe连接b.html,该页面有个函数test 在父页面调用b.html的test方法为: $("#mainfrm")[0].contentWindow.test(); 或者 this.frames["Iframe1"].doQuery(); 在当前弹出的子页面中打开另一个打开页面中的函数,例如在弹出的edit.html页面中调用dataList.html页面中的函数test parent

伴生类和伴生对象(apply方法的实践)

具有相同名字的object和class,分别为伴生对象和伴生类 1 class ApplyTest { //伴生类 2 3 } 4 5 object ApplyTest { //伴生对象 6 7 } 补充代码: object ApplyApp { def main(args: Array[String]): Unit = { var c = ApplyTest() // ==>object.apply() c() //==>class.apply() } } /** * 伴生类和伴生对象:具有

javascript——对象的概念——函数 1 (函数对象的属性和方法)

一.函数相关的属性: 1.arguments:访问函数的输入参数,由脚本解释器自动创建,具有length属性,可以用序号访问每个参数. 2.callee:arguments的属性,表正在执行的函数对象. 3.calleer:函数对象的属性,表函数对象的父函数对象.

JS中的call、apply、bind方法

JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj.