<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>call_apply</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
<meta http-equiv="Content-Type" content="text/html; charset=HZ" />
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
</head>
<script language="javascript">
/*
JavaScrtipt动态变换运行时上下文特性
foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments)==this.foo(arg1, arg2, arg3)
简直是”无中生有”,对象的方法可以任意指派,(有方法的一方,指派给另一方)。call, apply作用就是借用别人的方法来调用,就像调用自己的一样.
*/
function test0(){
function print(a, b, c){
alert(a + b + c );
//alert(a + b + c + d);
//alert(a + b + c + d+f);
}
function example(a, b , c , d){
alert(arguments); //成功
alert(this.arguments);//undefined
//用call方式借用print,参数一个一个处理
//print.call(this, a, b, c, d);
print.call(this, a, b, b, b);
//用apply方式借用print, 参数作为一个数组传递,
print.apply(this, arguments);
//或者封装成数组
print.apply(this, [a, b, c, d]);
}
//下面将显示”背光脚本”
example("背" , "光" , "脚", "本");
}
function test1(){
function Class1(){
this.showTxt = function(){alert(this.name)}
}
var obj = new Object();
obj.name="test1";
Class1.call(obj); //只是上下文对象发生了变化 也就是扩展了obj对象(使他 凭空多了些调用方法的接口,顺便相似的内容会被覆盖掉)
obj.showTxt(); //test1 是调用函数 如果没有置换掉 就是自身
alert(obj.name);
alert(obj.showTxt);//function(){alert(this.name)} 是对象的属性 toString()
}
function test2(){
function Class1(){
this.name = 'class1';//添加name值
this.showTxt = function(){alert(this.name)}
}
function Class2(){
this.name = 'class2';
}
var class2 = new Class2();
Class1.call(class2); //对当前class2对象进行动态的赋值设置处理
alert("Class2.showTxt........"+Class2.showTxt()); //注意:类实例扩展了接口,但是 类并没有扩展对应的接口************下同***********
alert(class2.name); //先定义的 class2 而后有被重置为class1
class2.showTxt();//class1 对象才能调用方法
class2.name = 'test1';//重定义obj.name值
alert(class2.showTxt);//对象的属性 就是字符串 function(){alert(this.name)}
class2.showTxt();//test1
}
function test3(){
function Class1(){
this.showTxt = function(){alert(this.name)}
}
function Class2(){
this.name = 'class2';
}
Class1.call(Class2); //两个类之间的处理
alert(Class2.showTxt);//对象的属性 也是字符串 function(){alert(this.name)}
Class2.showTxt();//扩展了类的接口,但是 没有调用类实例化的设置 (注意:类有扩展,类实例没有扩展处理)
class2 = new Class2(); //此时 在创建的对象 已经不具备代理引用的条件了
alert(class2.showTxt); //undefined 没有定义属性
}
function test4(){
function Class1(){
this.showTxt = function(){alert(this.name)};
this.showTxt2 = function(){alert(this.name)};
}
function Class2(){
this.name = 'class2';
}
var class1 = new Class1();
var class2 = new Class2();
class1.showTxt.call(class2);//class2类实例上面的方法的调用是 直接的调用,只是上下文this的引用进行了切换而已。
//class2类实例 及 类 都没有进行扩展
alert("Class2.showTxt........"+Class2.showTxt);//只是 对象方法的调用 类没有扩展
alert(class2.showTxt);//undefined (同时调用时一次性的,直接调用) ***********************
alert(class2.showTxt2);//undefined
Class1.call(class2); //对象的处理
class2.showTxt();
class2.showTxt2();
}
function test5(){
function Class1(){
this.showTxt = function(){alert(this.name)}
}
function Class2(){
this.name = 'class2';
}
var class1 = new Class1();
class1.showTxt.call(Class2);//类(也是类实例化)上面的方法的调用是 直接的调用,只是上下文this的引用进行了切换而已。
//Class2类 都没有进行扩展
alert(Class2.showTxt); //undefined
var class2 = new Class2(); //创建了新的对象 之前的代理引用 已经不成立了
alert(class2.showTxt);//undefined
}
function test6(){
function f1(){
alert(1);
}
function f2(){
alert(2);
}
function f3(){
alert(3);
}
function f4(){
alert(4);
}
f1.call(f2);//1 //将f1 中的代理this,替换为 f2 ;要创建一个真实的f1的实例化.。。
f1.call(f3);//1 //将f1 中的代理this,替换为 f2 ;要创建一个真实的f1的实例化.。。
var ff = f1.call; //自身的创建代理 不去创建对象 并保持这个引用,
ff.call(f2);//2 //如果单纯的调用,则 创建thisobj的对象
ff.call(f3);//3
ff.call(f4)//4
ff = f4.call;
ff.call(f2);//2
}
function test7(){
function jsCall(oThis){//这里的jsCall就是Call
var argsNew = [];
alert("arguments.length......"+arguments.length);
alert(this);
for(var i=1;i<arguments.length;i++){
argsNew.push(arguments[i]);
}
alert("before...........");
return this.apply(oThis,argsNew);
}
Function.prototype.jsCall = jsCall;
/*
或简写成
function jsCall(oThis){//这里的jsCall就是Call
var argsNew = [].slice.call(arguments,1);
return this.apply(oThis,argsNew);
}
*/
//参数已经传递过来,必须通过显示的定义来接收 a,b,c,d,e....
function f1(a,b){
alert(["in f1......","kkkkkkkkkkk"]);
//中括号 多个信息的展示处理
//f1.jsCall(f2)时,没有参数
alert([this,"it is param="+a+"....."+b,'f1']);
alert("in f1.......end");
}
function f2(a,b){
alert("in f2.....");
alert(this);//?为什么变成了 4321 有知道的话 回复我啊
alert([this,a+"..."+b,'f2']);
}
//此时处理的 F1的构造函数中的this参数已经发生了 变化
//f1.jsCall(f2); //直接调用处理
//f1.jsCall(f2,1234);// 1234
//f1.jsCall(f2,1234," after 000");// 1234..... after 000
var ff = f1.jsCall;
//alert(ff);
ff.jsCall(f2,4321,"this's really params"," secord param");//4321,this's really params,f2
}
</script>
<body>
应用一对象的一个方法,用另一个对象替换当前对象。
apply([thisObj[,argArray]])
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
<br/>
<INPUT TYPE=button value="test0" onclick="test0()">
<INPUT TYPE=button value="test1" onclick="test1()">
<INPUT TYPE=button value="test2" onclick="test2()">
<INPUT TYPE=button value="test3" onclick="test3()">
<INPUT TYPE=button value="test4" onclick="test4()">
<INPUT TYPE=button value="test5" onclick="test5()">
<INPUT TYPE=button value="test6" onclick="test6()">
<INPUT TYPE=button value="test7" onclick="test7()">
</body>
</html>
- 浏览: 50475 次
- 性别:
- 来自: 北京
相关推荐
_bind、call、apply 是 JavaScript 中的三个函数方法,用于改变函数的执行上下文,即改变函数中的 this 指向。下面我们将详细讲解这三个方法的使用和区别。 作用 _bind、call、apply 三者都是改变函数执行时的上...
同时,`arguments`对象可以被`Function.prototype.call()`和`Function.prototype.apply()`方法的`this`参数替换,增强了函数的灵活性。 6. **JSON支持**:内置了`JSON.parse()`和`JSON.stringify()`两个方法,方便...
javascirpt this_scope_call_apply_bind_柯里化 详细分析
6. this:this的值取决于函数的调用方式,可以是全局对象、对象方法、构造函数或call/apply/bind方法。 7.闭包:闭包是能够访问其自身作用域、外部函数作用域以及全局作用域的函数。 8.原型与原型链:JavaScript的...
在压缩包的文件中,7.6.js、7.7.1.js和arguments-call-apply.js很可能包含了关于这些主题的示例代码和讲解。通过学习这些文件,开发者可以深入理解如何在实际项目中使用`arguments`对象,以及何时选择`call`或`apply...
JavaScript中call与apply方法
在这段代码中,我们将练习bind , call和apply 。 您可以使用浏览器的JS控制台进行跟踪,也可以使用httpserver来提供所提供的index.html 。 HTML文件将自动加载index.js并在浏览器中显示您所做的编辑。 目标 使用...
在JavaScript编程中,`generator`、`apply`、`call`和`bind`是四个非常重要的概念,它们各自扮演着不同的角色,对于理解和编写高效、灵活的代码至关重要。接下来,我们将详细探讨这些知识点。 首先,`generator`是...
绑定,致电,申请实验室目标使用JavaScript的绑定,调用和应用方法来更改函数的范围并正确传递参数指示在本实验中,我们的测试定义了一些函数,然后将这些函数传递给我们要求您编写的函数。 您的函数不仅应调用作为...
这篇文章将深入探讨四个关键概念:caller、callee、call和apply,它们都是JavaScript函数操作的核心部分,对于理解和使用高级JavaScript编程至关重要。 首先,我们来了解`caller`和`callee`。在JavaScript的函数...
绑定,致电,申请实验室目标使用JavaScript的绑定,调用和应用方法来更改函数的范围并正确传递参数指示在本实验中,我们的测试定义了一些函数,然后将这些函数传递给我们要求您编写的函数。 您的函数不仅应调用作为...
在JavaScript中,`call()`, `apply()`, 和 `bind()` 是三个非常重要的函数,它们都与函数调用有关,但各自有不同的应用场景。本文将深入探讨这三个函数的实现原理及其使用方式。 首先,`call()` 函数允许我们调用一...
在JavaScript中,`call`和`apply`是两个非常重要的方法,它们都用于改变函数调用时的上下文(即`this`的值),并且可以灵活地传递参数。本篇文章将深入探讨这两个方法的用法、区别以及实际应用场景。 `call`方法...
### 理解JavaScript中的`caller`, `callee`, `call`, `apply` #### Arguments对象:JavaScript函数调用的参数管理器 在JavaScript中,每个函数都有一个隐含参数`arguments`,它允许开发者访问传递给函数的所有参数...
### JavaScript中apply、call和bind的用法区分 在JavaScript编程中,`apply`、`call`和`bind`这三个方法被广泛用于改变函数内部`this`的指向,这对于理解和编写复杂的JavaScript代码至关重要。虽然它们的功能相似,...
javascript callApply代码示例
在压缩包中的`main.js`文件可能包含了使用`apply()`, `call()`, 或 `bind()`的示例代码,`README.txt`可能提供了对这些示例的解释或使用场景。通过阅读和分析这些文件,你可以更好地理解这些方法的实际应用。
本篇将探讨JavaScript中的this、call和apply这三个关键知识点。 1. this的指向: - **作为对象的方法调用**:当函数作为对象的一个方法被调用时,`this`关键字会指向那个对象。例如: ```javascript var obj = {...
JavaScript 中的 call、apply、bind 方法详解 JavaScript 中的 call、apply、bind 方法是 Function 对象自带的三个方法,这三个方法的主要作用是转变函数中的 this 指向,从而可以达到“接花移木”的效果。下面将对...