JavaScript基础篇(3)之Object、Function等引用类型(4)

以上三种都是可行的,不过我们平时用得比较多的是第一种,第二种也有用,第三种用得比较少,但是最能看出function的本质,其实就是一个Function对象的实例。

我们来看看1和2的区别。

alert(sum1(1, 2));//弹出值 3 alert(sum2(1, 2));//报异常[sum2 is not a function] function sum1(num1, num2) { return num1 + num2; } var sum2 = function (num1, num2) { return num1 + num2; };

因为js解析器是从上到下的解析,在执行sum2的时候还没有定义,所以报异常。但是sum1比较特殊,是申明式的。在执行sum1之前就会”预解析“(函数声明提升)。相当于把sun1的定义提到了最上面(放到源代码树的顶部)。

方法重载

严格来说,js中是没有方法重载的,不过我们可以根据参数的个数来模拟。(还有,js中函数的形参我们是不确定类型的)

例:
上面并没有出现我们预料中的结果,因为第二次定义的sun1不是实现的重载,而是直接覆盖了第一次的定义。下面,我们就简单的模拟实现方法重载:

function sum1(num1, num2, num3) { if (num1 != undefined && num2 != undefined && num3 != undefined) { return num1 + num2 + num3; } else if (num1 != undefined && num2 != undefined) return num1 + num2; } alert(sum1(1, 2)); alert(sum1(1, 2, 3));

 函数内部属性(arguments 和 this)

arguments:类数组对象,包含着传入函数中的所有参数。下面通过arguments实现上面的模拟重载:

function sum(num, num, num) { var temp = ; if (arguments.length == ) { //***********具体实现其逻辑********************* for (var i = ; i < arguments.length; i++) { temp += arguments[i]; } } else { //***********具体实现其逻辑********************* for (var i = ; i < arguments.length; i++) { temp += arguments[i]; } } return temp; } alert("+=" + sum(, ) + " ++=" + sum(, , )); function sum1(num1, num2, num3) { var temp = 0; if (arguments.length == 3) { //***********具体实现其逻辑********************* for (var i = 0; i < arguments.length; i++) { temp += arguments[i]; } } else { //***********具体实现其逻辑********************* for (var i = 0; i < arguments.length; i++) { temp += arguments[i]; } } return temp; } alert("1+2=" + sum1(1, 2) + " 1+2+3=" + sum1(1, 2, 3));

我们在第一篇博文里面有提一个问题:

六、

var fun = function (num1) { if (num1 <= 1) { return 1; } else { return num1 * fun(num1 - 1); } } var fun2 = fun; fun = function () { return 1; } alert(fun2(5));//这里弹出什么?

不过,并没有同学去解答,有人可能觉得太简单,或是不乐意懒得去解答。这题的答案是:

为什么会是这个答案呢?好像和我们预料中的不一样。下面我们图解:

JavaScript基础篇(3)之Object、Function等引用类型

我们可能发现了一个问题,那就是第4步调用的已经不是所在的这个函数本身了(也就是没有递归了),这不是我们想要的。我们要的是,不管外面怎么改变,4处都代表所在的函数指针。那么我们可以用到arguments的callee方法,例:

函数的另一个内部属性this:

首先我们看看这样一个问题:

var color = "red"; var o = { color: "blue" }; function sayColor() { alert(this.color); } sayColor(); //"red" o.sayColor = sayColor; o.sayColor(); //"blue"

为什么会有不同的结果?我们记住一句话,一般情况"哪个对象点出来的方法,this就是哪个对象"。上面的例子其实等效于:

window.color = "red"; var o = { color: "blue" }; function sayColor() { alert(this.color); } window.sayColor(); //"red" o.sayColor = sayColor; o.sayColor(); //"blue"

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgzgdd.html