每个函数都是Function类型的事例,与其他引用类型一样具有属性和方法。
函数是对象,函数名是指针。因此一个函数可能会有多个名字。
function sum(num1, num2) {
return num1+ num2;
}
alert(sum(10, 10)); //20
var anotherSum = sum;
alert(anotherSum(10, 10)); //20
sum = null
alert(anotherSum(10, 10)); //20 因为使用不带圆括号的函数名是访问函数指针,不是调用函数所以sum和anothersum指向同一函数。即使将sum设置为null,但仍可以调用anotherSum。
</br>
</br>
将函数名想象为指针,有助于理解ECMAScript中没有重载的概念。
function addNum(num) {
return num+ 100;
}
function addNum(num) {
return num+ 200;
}
var result = addNum(100) // 300 在创建第二个函数时,实际覆盖了引用了第一个函数的变量
</br>
</br>
函数声明和函数表达式区别
</br>
</br>
解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到他所在的代码行,才会真正被执行。
alert(sum(10, 10))
function sum(num1, num2)
{ return num1+ num2 }; //代码会正常运行,解析器通过function declaration hoisting,读取并将函数声明添加到执行环境。
alert(sum(10, 10))
var sum = function(num1, num2)
{ return num1+num2 }; //报错,原因在于函数位于初始化语句,而不是函数声明。
</br>
</br>
函数内部属性
函数内部有两个特殊对象 arguments 和 this。 arguments是一个类数组对象,包含传入函数中所有参数。
这个对象有一个名叫callee的属性,该属性是一个指针,指向这个拥有arguments对象的函数。
arguments此对象大多用来针对同个方法多处调用并且传递参数个数不一样时进行使用。根据arguments的索引来判断执行的方法。
This与java和C#用法类似。this引用的是函数执行的环境对象。当在网页的全局作用域中调用函数,this指代对象就是window.
情况一:纯粹的函数调用
这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。
请看下面这段代码,它的运行结果是1。
function test(){
this.x = 1;
alert(this.x);
}
test(); // 1
</br>
</br>
为了证明this就是全局对象,我对代码做一些改变:
var x = 1;
function test(){
alert(this.x);
}
test(); // 1
</br>
</br>
运行结果还是1。再变一下:
</br>
</br>
var x = 1;
function test(){
this.x = 0;
}
test();
alert(x); //0
情况二:作为对象方法的调用
函数还可以作为某个对象的方法调用,这时this就指这个上级对象。
function test(){
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1
情况三 作为构造函数调用
所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。
function test(){
this.x = 1;
}
var o = new test();
alert(o.x); // 1
运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:
var x = 2;
function test(){
this.x = 1;
}
var o = new test();
alert(x); //2
运行结果为2,表明全局变量x的值根本没变。
情况四 apply调用
apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。
var x = 0;
function test(){
alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0
apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。
如果把最后一行代码修改为
o.m.apply(o); //1
运行结果就变成了1,证明了这时this代表的是对象o。
对象方法中又嵌套方法方法中的this仍然是window对象
在事件中指向触发事件的标签
方法套方法在结束花括号写bind里面传this .bind(this) 指向当前对象
call和apply也可以改变指向
call和apply区别 是apply要以数组的方式传递参数 call参数列表形式传递
网友评论