解析js中的call

昨天看到这篇文章 http://uule.iteye.com/blog/1158829

里面讲到call的使用方法,但是作者没有讲清楚里面的关系,我的理解是

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

原作者在这里举例是如下的例子,他的解释是: 这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

function Add(a, b) {
alert(this); //输出sub函数
alert(a + b);
}
function sub(a, b) {
alert(this);
alert(a - b);
}
Add.call(sub, 3, 1);

我在两个函数之间加上了alert(this),其实这两个函数Add和sub是属于全局对象的,那么在此Add.call(sub, 3, 1);就相当于Window.Add.call(Window.sub,3,1)。这样就很明显了,call的意思是切换上下文,执行call时,上下文切换至Window.sub,可以用alert(this)来进行调试,上下文虽然切换了,但是还是调用的Window.Add。这样理解就很清楚了。

如果不是很明白,请看下面的例子。

function Animal() {
this.name = "Animal";

this.Say = function () {
alert(this);
alert(this.name);
}
}

function Cat() {
this.name = "Cat";
}

var animal = new Animal();
var cat = new Cat();
animal.Say.call(cat,",");

这里加入了一些alert,便于调试,alert(this);---alert(this.name);这样的执行顺序,调用animal.Say时上下文已经切换到cat对象,所以this就指向的cat,
this.name就等于Cat了。

再回头看上面的,调用Add方法时,上下文切换至Sub方法,然并卵,还是执行的Add方法。原作者的举例不太恰当吧。

参考:http://uule.iteye.com/blog/1158829

时间: 2024-08-01 06:31:10

解析js中的call的相关文章

浅解析js中的对象

浅解析js中的对象 说到对象,我首先想到的是每逢过年过节,长辈们老是开玩笑的问我“你找了对象没?”.不说大家都知道,这里的“对象”指的是“女朋友”,但是今天我想要说的js中的“对象”和我们生活中谈到的“对象”不是同一回事,但是其中也有着很多相似之处.    在讲js中的对象之前,我想先抛出几个疑问:    什么是对象?    对象有哪些?    对象能做什么?    如何创建对象?    如何对对象进行操作?    对象有特性么?有的话有哪些特性?    对象有属性么?有的话有哪些?对属性如何操

解析js中作用域、闭包——从一道经典的面试题开始

如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎么写,是不是这样? 可是结果呢,弹出来的都是10,为啥? var i,a for(i=0;i<10;i++){ a=document.createElement('a') a.innerHTML=i+'<br>' a.addEventListener('click',function(eve

python:解析js中常见的 不带引号的key的 json

首先要明晰一点,json标准中,key是必须要带引号的,所以标准json模块解析不带引号的key的 json就会抛错 不过有一些lib可以帮我们解析 如:demjson(链接) >>>> import demjson >>> demjson.decode('{suggestion:[{query:"London",interpretation: ...') {u'suggestion': [{u'query': u'London', u'ope

全面解析js中的for循环

JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for(var index=0;index<myArray.length;index++) { console.log(myArray[index]); } 自从JavaScript5起,我们开始可以使用内置的forEach方法: myArray.forEach(function (value) { console.log(value); }); 写法虽然简单了很多,但是有很多的短处:不能中断循环(使用br

判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

转载自[脚本之家],原文链接:http://www.jb51.net/article/42864.htm 提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以都转换成小写,以防出错 1.typeof(param) 返回param的类型(string) 这种方法是JS中的定义的全局方法,也是编译者们最常用的方法,优点就是使用简单.好记,缺点是不能很好的

JS中undefined、null以及NaN之间的区别,以及对象属性赋值的面试题

(1)以下三种情况typeof 返回类型为undefined --当变量未初始化时 --变量未定义时 --函数无明确返回值时(函数没有返回值时返回的都是undefined) (2)Null 类型 undefined 是由null派生处理的,因此undefined == null undefined 是声明了但是没有初始化的该变量, null表示尚未存在的对象 . (3)NaN 值 是一个特殊值,表示非数(Not a Number),类型转换失败就会返回NaN --NaN 不等于自己,即 NaN

js中eval详解,用Js的eval解析JSON中的注意点

先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值,简单示例如下: var s1='"a" + 2'; //表达式var s2='{a:2}'; //语句alert(eval(s1)); //->'a2'alert(eval(s2)); //->und

JS中生成与解析JSON

js中生成json对象 js中解析json字符串: 1.eval("..."): var a_id=eval('{"name":123}'); 如果eval中的内容含有恶意脚本就麻烦了 2.json_parse: 需要导入json_parse.js: <script src="js/json_parse.js"></script>    <script language="javascript"&

JS中parseInt()、Numer()深度解析

JS中字符串转换为数字有两种方式: 1.parseInt函数 定义:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt 语法:parseInt(string [ , radix]) 参数: string:要被解析的值.如果参数不是一个字符串,则将其转换为字符串.字符串开头的空白符将会被忽略. radix:一个2到36之间的整数值,用于指定转换中采用的基数. 如果省略该参