要注意:如果函数内部声明了与形参同名的子函数(同域内,变量未赋值时同名函数生效),arguments 的相应值也会被修改,但是,在作用域内使用 var 声明了同名的 变量则不会导致 arguments 的参数值被函数替换(但firefox 依然替换)。
复制代码 代码如下:
function aa(a , b,c){ //js 群的一道题
function a(){}
console.log(a); //function a
console.log(aa);
//如果作用域内没有 var a ,则 arguments[0] 为 function a (friefox(version 17) 则一定是function a)
console.log(arguments[0]);
var a = "ee"; //注销此句,考擦 arguments[0] 将变为 a 函数
var aa = "444";
arguments = 6;
console.log(a);
console.log(aa);
console.log(arguments);
}
aa(1,2,3);
三、函数的返回值
js函数使用 return 语句返回值。
一切数据类型都可以作为函数的返回值(包括函数),js函数也可以没有返回值。
四、函数调用
函数自己是不会运行的,当它运行时,总是存在一个调用它的对象。
默认情况下,在任何语法环境中,如果没有显式指定函数的调用对象,就是指通过window对象来调用该函数,此时,函数体内的this指针指向window对象。
复制代码 代码如下:
function myfun(a,b){
alert(this);
return a+b;
}
myfun(1,2); // 调用函数并传入2个参数,这2个参数分别对应形式参数a,b调用函数时,如果传入的参数个数超过形式参数,就只有用arguments加下标来接收了。
由于没有显式指定调用函数的对象,alert(this)将弹出 window对象。这种调用方法是最常见的。
用于显式指定函数的调用对象方法有三个:
1、如果一个函数被赋为一个对象的属性值,这个函数只能通过该对象来访问(但并非是说该函数只能被该对象调用),通过该对象调用这个函数的方式类似以面向对象编程语言中的方法调用(实际上在js中也习惯使用方法这种称呼)。
复制代码 代码如下:
var obj={}; //定义一个对象
obj.fun=function(a,b){
alert(this); //弹出this指针
return a+b;
} //对象属性值为函数
alert(obj.fun);// 访问fun函数。 只能通过该对象来访问这个函数
obj.fun(1,2); //通过obj对象来调用fun函数,将弹出obj对象。这种方式也称为调用obj对象的fun方法。
2、 任意指定函数的调用对象:在某个语法环境中,如果可以同时访问到函数fun和对象obj,只要你愿意,可以指定通过obj对象来调用fun函数。指定方法 有2种:call方法和apply方法。(因为window对象是浏览器环境下的顶级对象,在任何语法环境中都能访问到window对象,因此,任何函数 都可以通过window对象来调用)
复制代码 代码如下:
function fun(a,b){
alert(this);
return a+b;
}
var obj={};
fun.call(obj,1,2); //通过obj对象来调用fun函数,并传入2个参数,弹出的指针为obj对象。
var obj2={};
obj2.fun2 = function(a,b){ //obj2对象的属性fun2是一个函数
alert(this);
return a+b;
};
obj2.fun2.call(obj,1,2); //通过obj对象来调用obj2对象的fun2属性值所保存的函数,弹出的this指针是obj对象
//比较隐蔽的方法调用:数组调用一个函数[9,function(){ alert(this[0]); }][1]();
//使用window对象调用函数下面几种方法是等价的
fun(1,2);
window.fun(1,2); //如果fun函数是全局函数
fun.call(window,1,2);
fun.call(this,1,2); //如果该句代码在全局环境下(或者被window对象调用的函数体内),因为该语法环境下的this就是指向window对象。
func.call(); //如果函数不需要传参
func.call(null,1,2);
func.call(undefined,1,2);var name = "window";
function kkk(){
console.log(this.name); // not ie
}
kkk(); //window
kkk.call(kkk); //kkk 函数被自己调用了
另一种比较容易疏忽的错误是,在A 对象的方法中,执行了使用了 B 对象的方法调用,试图在 B 对象的方法里使用 this 来访问 A 对象,这在各种回调函数中比较常见,最常见的情形就是 ajax 回调函数中使用 this 。
复制代码 代码如下: