函数与变量名字相同怎么处理?

如果函数与变量名字相同怎么处理?

尝试心算一下这个面试题,结果是什么呢??

var a = 10;
function a(x){
console.log(a);
function x(){}
};
a();

结果:a is not a function

根据变量函数的预加载,改成简单写法:

//预加载
function a(){
console.log(a);
};
var a;
//自上而下执行
a = 10;
a();//本以为是10结果报错not a function

函数与变量名字相同怎么处理?_第1张图片

哪里出错了?!为什么a报错不是一个函数呢??a与函数a应该是互相影响了。接着查找资料找到了一个比较可靠地解决思路:
注意注意,抛弃之前思路,跟着这个新的思路走一波~~~

正确分析:
1.预加载了一个变量 a 和 函数a(){}--此时a=a(){}
2.执行代码a = 10;此时a = 10;--函数a(){}被变量的赋值所覆盖。
3.执行代码调用a(){};--由于函数a(){}已经被覆盖,所以a此时值为10,不是函数。

也许有道理,接着我们继续验证~~~
问题再次提出,如果我们反过来,先调用函数再给全局变量赋值呢??根据上边“先入为主”规则,调用了函数还能被覆盖么??

    function a(){
        var a = 100;
        console.log(a);
    };
    var a;
    console.log(a);//a函数
    a();//100
    console.log(a);//a函数
    a=10;
    console.log(a);//10

函数与变量名字相同怎么处理?_第2张图片

居然可以调用函数,之后还成功的被赋值了!棒棒的!
那么,我再加一个调用,还能成功吗?
验证:

    function a(){
        var a = 100;
        console.log(a);
    };
    var a;
    console.log(a);//a函数
    a();//100
    console.log(a);//a函数
    a=10;
    console.log(a);//10
    a();//a is not a function

结果:
先调用a函数,没有问题;
后给a赋值也没有问题; 再调用a函数,报错了!a is not a function又回到前边的一个情况,此时a=10。函数无法再次调用。

函数与变量名字相同怎么处理?_第3张图片

那么根据这几个demo,思考良久,有一个小小的总结。

结论:在脚本预加载时,先加载参数,其次是函数,最后是全局变量。
之后代码从上到下依次执行,如果参数,函数,全局变量命名相同,都会参数或全局变量会转变成函数。
调用函数可以在全局变量被赋值之前调用,否则,报错not a function

仅限于个人理解,具体还是要亲自写demo去总结。

总之团队中要避免出现参数,函数,全局变量命名一致的状况。

扩展一个面试题:

function d(){
var a = b = c = 10;//函数内没有被var声明的是全局变量
console.log(a);//10
console.log(b);//10
console.log(c);//10
};
d();
console.log(c);//10
console.log(b);//10
console.log(a);//a is not defind

我的总结比较通俗,好比如大白话,下边是比较上档次的理解:
http://www.cnblogs.com/wyangnb/p/8317071.html

有错误的话希望能指出来,网络化的社会万一误导了谁,深表惭愧。。。

你可能感兴趣的:(js)