前言
本篇文章的内容主要是针对面向对象中的一些事例进行探讨,也是本人在学习是遇到的一些问题集锦,希望能给大家一点帮助,如有错漏,望给予指点。
一、函数调用
先看以下示例:
function test(){
var a = 1;
function subtest(){
return a++
}
return subtest;
}
// 调用1
console.log(test()()); //1
console.log(test()()); //1
// 调用2
var fn = test();
console.log(fn()); //1
console.log(fn()); //2
从示例中我们不难看出,调用1和调用2都是通过将内部函数subtest作为外部函数test的返回值,从而进行内部函数的调用,为什么最后打印出的结果却不同呢
根据结果进行初步分析,调用1是进行了双重调用,也就是在调用了外部函数test之后,紧接着调用了内部函数subtest,每次subtest的a++都是建立在外部函数test的定义的a的数值上的
所以每次执行时,a是test函数的局部变量,每次的值都会重新赋值为1
调用2首先调用test函数,将返回值subtest函数赋值给变量fn,之后直接调用fn,也就是直接调用了subtest内部函数
所以每次执行时,a相对于subtest函数是全局变量,每次调用的值都会储存
假设将a作为整个函数的全局变量
var a = 1;
function test(){
function subtest(){
return a++
}
return subtest;
}
// 调用1
console.log(test()()); //1
console.log(test()()); //2
// 调用2
var fn = test();
console.log(fn()); //3
console.log(fn()); //4
每次调用的值都发生变化,可见先前的分析的结论是正确的
二、数组的拼接
为了实现arr1和arr2两个数组的拼接,写了如下代码
var arr1 = [1,2,3];
var arr2 = [4,5];
Array.prototype.combo = function(arr){
for(var i in arr){
this.push(arr[i]);
}
}
arr1.combo.apply(this.arr2); //间接调用失败
console.log(arr1); //undefined
结果失败,最后打印出undefined,下面开始尝试修改,并寻找失败原因
var arr1 = [1,2,3];
var arr2 = [4,5];
Array.prototype.combo = function(arr){
for(var i in arr){
arr1.push(arr[i]); //不能使用this
}
}
arr1.combo(arr2); //直接调用
console.log(arr1); [1,2,3,4,5,f]
经过修改,最后勉强将两个数组进行了合并,但是最终数组长度多了1,于是作者特地进行了查找,最后找到两种拼接数组的简单方法
拼接2个数组
var arr1 = [1,2,3];
var arr2 = [4,5];
Array.prototype.push.apply(arr1,arr2) ; //返回原数组
console.log(arr1); //拼接2个
直接给数组原型调用push方法并间接调用arr1,arr2两个数组,返回数组arr1
拼接多个数组
var arr1 = [1,2,3];
var arr2 = [4,5];
var arr3 = [6,7];
var arr = arr1.concat(arr2,arr3);
console.log(arr); //拼接多个
使用concat方法给一个数组添加元素