面向对象题解

前言

本篇文章的内容主要是针对面向对象中的一些事例进行探讨,也是本人在学习是遇到的一些问题集锦,希望能给大家一点帮助,如有错漏,望给予指点。

一、函数调用

先看以下示例:

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方法给一个数组添加元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值