试图从书 javascript Ninja 中理解 javascript 代码

Posted

技术标签:

【中文标题】试图从书 javascript Ninja 中理解 javascript 代码【英文标题】:Trying to understand javascript code from book javascript Ninja 【发布时间】:2014-04-07 01:27:21 【问题描述】:

从下面的例子中,我想我理解了所有的代码,除了我无法理解为什么需要 this.assert 和 this.test? 没有它们,这段代码就不能忍受吗?

这是来自 javascript ninja 的秘密一书

 <script>   
    (function() 
        var results;
        this.assert = function assert(value,desc) 
            var li = document.createElement("li");
            li.className = value ? "pass" : "fail";
            li.appendChild(document.createTextNode(desc));
            results.appendChild(li);

            if (!value) 
                li.parentNode.parentNode.className = "fail";
            
            return li;
        ;
        this.test = function test(name,fn) 
            console.log("JOT");
            results = document.getElementById("results");
            console.log("this is" , results)
            results = assert(true, name).appendChild(
                document.createElement("ul"));
            fn();
        ;
    )();

    window.onload = function() 
            console.log("before");
        test("A test.", function() 
            console.log("after a test");
            assert(true, "First assertion completed");
            console.log("after assert1");
            assert(true, "Second assertion completed");
            console.log("after assert2");
            assert(true, "Third assertion completed");
            console.log("after assert3");
        );
        test("Another test.", function() 
            assert(true, "First test completed");
            assert(true, "Second test completed");
            assert(false, "Third test fail");
        );
        test("Another test.", function() 
            assert(true, "First test completed");
            assert(true, "Second test completed");
            assert(true, "Third test completed");
        );
    ;
</script>

【问题讨论】:

“为什么需要它们”是什么意思?如果它们不存在,您将无法在 window.onload 方法中调用它们。 这里不建议使用命名函数表达式。 IE have issues with them 的某些版本以及名称应该仅在函数本身中可用。鉴于这些名称并未在函数本身中使用,因此拥有它们似乎并不明智。我也不认为这是创建全局对象属性的明智方法。在我看来,它应该在严格模式下失败。 使用命名函数表达式是个好主意。它有助于调试。 考虑到 IE 和严格模式的问题,并且可以用函数声明替换它们,我不明白这一点。请考虑:(function(global)var result; function assert()...; global.assert = assert; ...(this));。适用于任何地方(包括严格模式),名称可在函数内部用于调试,它们被显式添加为全局变量,并保留 result 的闭包。那里赢了很多。 :-) 【参考方案1】:

顶部函数中的this 指的是全局对象,因为它既不作为构造函数调用,也不作为方法调用。在网络浏览器中,全局对象是window

无论如何,将属性分配给全局对象允许您将其作为全局变量引用。稍后在代码中,asserttestonload 函数中可用。

那么为什么不直接说window.assert = ...呢?一个原因是代码示例中的构造更便于移植,以防您需要在全局对象不是 window 的 JavaScript 环境中运行它。

【讨论】:

感谢大家的回答(总的来说它帮助我更好地理解)。更让我困惑的是函数名 assert 和 this.assert 同名。 (以不同的方式使用匿名函数或命名函数对我有很大帮助。

以上是关于试图从书 javascript Ninja 中理解 javascript 代码的主要内容,如果未能解决你的问题,请参考以下文章

CMake/Ninja 试图编译已删除的“.cpp”文件

html javascript.groupAsynTest.html - 在“javascript ninja”中实现组asyn测试的优秀代码

Javascript,IF 语句中的逗号 - 试图理解这段代码

自定义 jQuery 不适用于 Wordpress Ninja Forms 插件

JavaScript:试图理解计算指数值的递归函数的 Else 语句

在 Mac OS 10.15 上使用 gn 和 ninja 从源构建电子时出错