共计 1926 个字符,预计需要花费 5 分钟才能阅读完成。
JavaScript 函数内部属性
函数内部有两个特殊对象,this、arguments, 其中 arguments 是一个类数组对象,包含着传入函数中的所有参数,主要用来保存函数参数。arguments 对象还有一个 callee 属性,callee 是一个指针,指向拥有这个 arguments 对象的函数。
callee
function fact(num){
if(num<=1){
return 1;
}else{
return num*fact(num-1);
}
}
这是一个实现阶乘的函数,采用递归的方式,这种方式存在一个问题就是,当 fact 的名称更改以后,如果不及时更改函数内部的函数名称,该函数则无效。此时采用 callee 属性替代当前拥有 num 参数对象的函数也就是 fact.
采用 callee 实现如下
function fact(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
this
this 引用的是函数执行的环境对象,当函数被当做某个对象的方法调用时,此时的 this 对象引用的是当前调用函数的对象。
不同的环境 this 指向的值不同,下面是几种 this 在不同执行环境下所指向的值
方法调用
当函数作为对象方法的时候,函数里的 this 被绑定到当前对象上(也可以称之为方法调用)
例如:
var myNum = {
value:1,
increment:function(arg){
this.value +=arg;
}
};
myNum.increment(3);
console.log(‘example1:’+myNum.value);//example1:4
上述的 increment 是一个对象方法,该对象方法内部的 this 指向的就是当前对象
函数调用
当函数作为非对象方法时候,this 绑定到全局对象 window,如果此时要调用内部函数可以采用 that = this。
// 一般的函数
function add(a){
return a+2 ;
}
var value = 2;
myNum.count = function (){
let value = 1;
let help = function(){
this.value = add(this.value);
}
help();
console.log(this.value);//4
}
myNum.count();
that = this 方式
var value = 2;
myNum.count = function (){
let value = 1;
let that = this;
let help = function(){
that.value = add(that.value);
}
help();
console.log(that.value);//3
}
myNum.count();
构造函数
用 new 运算符调用构造函数,会先创建一个连接到构造函数的 prototype(原型对象),再将 this 绑定到该对象
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
return this.name;
}
var person1 = new Person(‘TOM’);
console.log(person1.sayName());
apply\call\bind
绑定 this 到指定的环境对象
var people = {
name:”LILY”
}
console.log(Person.prototype.sayName.apply(people));
console.log(Person.prototype.sayName.bind(people)());
console.log(Person.prototype.sayName.call(people));
call:方法调用一个具有给定 this 值的函数,以及提供的参数列表。apply: 方法调用一个具有给定 this 值的函数,以及提供的参数(数组或类数组对象)。bind:方法创建一个新的函数,调用时设置 this 关键字为提供的“值”。
ES6 箭头函数
es6 箭头函数里的 this 指向定义时所在的对象,不是执行的环境对象,就说明 this 在箭头函数里使用时是一个不变的值
function foo(){
setTimeout(()=>{
console.log(‘name:’,this.name);
},1000)
}
var name = “kiki”;
foo.call({name:”didi”});//name:didi
箭头函数里 this 的值指向的是定义时所在的环境对象,es5 中实现箭头函数的方法:采用 that = this 这种机制,实现 this 的绑定
以上是对函数的内部属性的理解。