js中函数的 this、arguments 、caller,call(),apply(),bind()
在函数内部有两个特殊的对象,arguments 和 this,还有一个函数对象的属性caller。
arguments对象
arguments是一个类似数组的对象,包含着传入函数的所有参数。
function doAdd(){
if(arguments.length == 1){
return arguments[0] + 10;
}else if(arguments.length == 2){
return arguments[0] + arguments[1];
}
}
console.log(doAdd(11)); //
console.log(doAdd(11,20)); //
arguments对象还有一个属性callee,该属性是一个指针,指向拥有这个arguments对象的函数。
function factorial(num){ if(num <=1){
return 1;
} else {
return num*arguments.callee(num - 1);
} }
// 消除代码和函数名的耦合。
在严格模式 ("use strict")下,访问 arguments.callee 会出错。
在严格模式下也能实现递归:
var factorial = (function f(num){ if(num <=1){
return 1;
} else {
return num*f(num - 1);
}
});
console.log(factorial(4)); //
this对象
this引用的是函数的执行环境对象。在函数调用之前this对象的值是不确定的,在网页浏览器的全局作用域中调用函数时,this对象引用的是window:
window.color = "red";
var o ={
color : "blue"
}; function sayColor(){
alert( this.color);
}
sayColor(); // red, 在全局作用域中调用函数,this引用的是window对象 o.sayColor = sayColor;
o.sayColor(); // blue, 引用对象o
caller属性
caller属性指向调用该函数的函数,如果是在全局作用域中调用当前函数,它的值为null:
function outer(){
inner();
}
function inner(){
console.log(inner.caller);
// console.log(arguments.callee.caller);
} outer(); // 打印outer函数的源代码
inner(); //打印null
call()和apply()
每个函数都包含这两个非继承而来的函数,这两个函数的用途都是在特定的作用域中调用函数,实际上等同于在设置函数体内的this对象的值。
apply()有两个参数,第一个是运行时函数的作用域(执行环境)对象,第二个是参数对象,可以是arguments对象,或者是数组
call()函数的第一个参数也是作用域对象,其余参数是传递给函数的参数,需要逐个列出来
apply()和call()最常用的场景是改变函数运行的作用域。这样对象就可以不需要和方法有任何耦合的关系
var color = "red";
var o = {"color":"blue"};
function sum(num1,num2){
console.log(this.color);
return num1+num2;
}
function callSum1(num1,num2){
return sum.apply(this, arguments);
}
function callSum2(num1,num2){
return sum.apply(this, [num1,num2]);
} function callSum3(num1,num2){
return sum.call(this, num1,num2);
} o.callSum1 = callSum1;
o.callSum2 = callSum2; console.log(callSum1(10,10)); // red 20
console.log(callSum2(10,10)); // red 20
console.log(callSum1.apply(o,[10,10])); // blue 20
console.log(callSum3.call(o,10,10)); // blue 20,直接改变作用域
console.log(o.callSum1(5,10)); // blue 15
console.log(o.callSum2(5,10)); // blue 15
bind()
bind()函数会创建一个函数实例,新的函数的this值为被绑定为传给bind()函数的值
var color = "red";
var o = {"color":"blue"}; function sayColor(){
console.log(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); // blue, 即使在全局中调用,this值仍为对象o
js中函数的 this、arguments 、caller,call(),apply(),bind()的更多相关文章
- JS中函数参数和函数返回值的理解
函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...
- js中函数传参的情况
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 对JS中函数的理解
函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...
- 关于js中函数的调用问题
js中函数的调用方法 1.直接调用 函数名(参数): 2.通过指向函数的变量去调用 例如: var myval = 函数名: 此刻 myval是指向函数的一个指针: myval(实际参数):此刻调用的 ...
- JS中函数void()
<a href="javascript:void(0)">hello</a>/* * JS中函数void()的运用大体是这种新式; * void()是运算符 ...
- js中函数的参数为函数的情况即回调函数
js中函数的参数可以是数组对象也可以是函数,当参数为函数时我们叫做回调函数 //定义回调函数function B() { console.log("函数B")setTimeout( ...
- JS中函数的调用和this的值
调用每一个函数会暂停当前函数的执行,传递控制权和参数给新函数.除了声明时定义的形式参数,每个函数还接收两个附加的参数:this 和 arguments. 参数this在面向对象编程中非常重要,他的值取 ...
- js 中arguments,call,apply,bind的使用
//对于 arguments和this, 每个函数都有自己独有的arguments和this, 且不进行链式查找 //arguments是什么? //答:1:arguments是收到的实参副本 //2 ...
- js中函数this的指向
this 在面试中,js指向也常常被问到,在开发过程中也是一个需要注意的问题,严格模式下的this指向undefined,这里就不讨论. 普通函数 记住一句话哪个对象调用函数,该函数的this就指向该 ...
随机推荐
- [Unity插件]Lua行为树(六):打印树结构
经过前面的文章,已经把行为树中的四种基本类型节点介绍了下.接下来可以整理一下,打印一下整棵行为树.注意点如下: 1.可以把BTBehaviorTree也当作一种节点,这样就可以方便地进行行为树嵌套了 ...
- Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/tx]
ERROR - Context initialization failed org.springframework.beans.factory.parsing.BeanDefinitionParsin ...
- python 生成器 的send
>>> def f(): c=yield 5 print c d=yield c+5 print d >>> b=f() >>> b.send(N ...
- python内置函数使用
print(abs(1)) #绝对值,正数就是自己 ",''])) #计算可迭代对象中是否为真,其中一个为假,就显示为假 print(all('')) # If the iterable i ...
- HashMap.put()和get()原理
/** * Returns the value to which the specified key is mapped, * or if this map contains no mapping f ...
- 机器学习入门-文本数据-构造词频词袋模型 1.re.sub(进行字符串的替换) 2.nltk.corpus.stopwords.words(获得停用词表) 3.nltk.WordPunctTokenizer(对字符串进行分词操作) 4.np.vectorize(对函数进行向量化) 5. CountVectorizer(构建词频的词袋模型)
函数说明: 1. re.sub(r'[^a-zA-Z0-9\s]', repl='', sting=string) 用于进行字符串的替换,这里我们用来去除标点符号 参数说明:r'[^a-zA-Z0- ...
- scala 爬虫 去除不能存储的特殊字符
scala 爬虫 去除不能存储的特殊字符 /** * 去除不能存储的特殊字符 */ def zifuChange(str: String): String = { var bo = true var ...
- li之间的间隙问题
1.间隙是有代码格式中的换行符产生,对代码进行压缩处理或手动删除换行就好:
- li直接1px 像素的原因
1.由于空白节点(多由于Enter造成),li不换行就可以解决问题. Internet Explorer会忽略节点之间生成的空白节点,其它浏览器不会忽略(可以通过检测节点类型,过滤子节点) 2.完美解 ...
- maven创建项目,打包出可执行Jar
官网参考 http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html 配置多种打包方式 这个例子也不错 https://bl ...