zoukankan      html  css  js  c++  java
  • JavaScript中调皮的undefined

    JavaScript中调皮的undefined

    在JavaScript中undefined只是一个标识符,不是关键字,这个很不靠谱的标识符还不能像其他符号一样随意使用,一方面是需要它的原始值保持不变,另一方面是用法不当还会产生很多意向不到的bug。有这种不靠谱的标识符的语言遗留问题,我们在编程时为了保证这家伙始终如一,保证我们的程序强壮性,就得使用一些手段了。

    function foo() {
        undefined = 2;//undefined
    }
    function bar(){
        "use strict";
        undefined = 2;//TypeError
    }
    foo();
    bar();

    从上面的运行来看,undefined在没有被关键字var执行声明的情况下,undefined的原始值并不能被直接修改。

    "use strict";
    var undefined = 2;//TypeError

    在严格模式下全局上声明undefined并赋值还是报错。

    var undefined = 2;
    console.log(undefined);//undefined

    全局非严格模式下undefined即使声明undefined为变量还是不能修改它的值。

    function foo(){
        "use strict";
        var undefined = 2;
        console.log(undefined);//2
    }
    foo();

    只有在非全局作用域下声明undefined为局部变量可改变值,且在严格模式下也能不报错。研究undefined的标识符被修改值绝对不是想修改它,而是我们要明白在什么情况下会因为无意的修改它的值,或者因为不恰当的操作会报错。这还只是一方面,另一方面是我要怎么样才能保证我们能获得一个真正的undefined的值。

    通常我们为了保证我们局部作用域获得的undefined的值就是一个真正的undefined的值,有三种方式:

    function foo(a,b,undefined){
        console.log(a);
        console.log(b);
        console.log(undefined);
    }
    //在形参中定义undefined,但在实参中不传值
    //就可以保证这个局部作用域下的undefined是一个真正的undefined
    foo("a","b");
    //在jQuery中,构建jQuery的模块时就使用了这种方法
    (function(window,undefined){
        //....
    })(window);

    还有一种情况就是不让表达式返回任何结果:

    function doSomething(){
        if(!APP.ready){
            return void setTimeout(doSomething,100);
        }
        var result;
      //...
    return result; } if(doSomething()){ //... }

    void运算符可以保证后面的程序正常执行,但永远返回undefined。这里setTimeout(...)函数会返回一个数值(计时器间隔的唯一标识符,用来取消计时器),但是为了保证if语句不产生误报(false positive),我们需要void去掉它。

  • 相关阅读:
    一行代码轻松修改 Text Field 和 Text View 的光标颜色 — By 昉
    六种手势识别,你用了哪些?——董鑫
    Mac 屏幕录制Gif 制作 By-胡罗
    利用ICMP协议的PING命令获取客户端当前网络质量 by徐文棋
    iOS加载Gif图片的N种方式 By-H罗
    [手游项目3]-10-Go语言atomic原子操作
    [手游项目3]-9-Go语言sync.Map(在并发环境中使用的map)
    LRU原理和Redis实现
    Cleanup failed to process the following paths错误的解决
    [手游项目3]-8-排行榜redis实现
  • 原文地址:https://www.cnblogs.com/ZheOneAndOnly/p/10251070.html
Copyright © 2011-2022 走看看