Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我不知道';我不理解JavaScript代码片段_Javascript_Unit Testing - Fatal编程技术网

我不知道';我不理解JavaScript代码片段

我不知道';我不理解JavaScript代码片段,javascript,unit-testing,Javascript,Unit Testing,您好,我正在培训制作一些断言库,但是我在理解代码部分中的javascript行为时遇到了一个大问题。这是代码 (function(){ var results; this.assert = function(value, desc){ var li = document.createElement('li'); // I got two CSS classes "pass" and "fail" li.className = va

您好,我正在培训制作一些断言库,但是我在理解代码部分中的javascript行为时遇到了一个大问题。这是代码

(function(){
    var results;
    this.assert = function(value, desc){
        var li = document.createElement('li');

        // I got two CSS classes "pass" and "fail"
        li.className = value ? 'pass' : 'fail';

        var txt = document.createTextNode(desc);

        li.appendChild(txt);
        results.appendChild(li);

        if(!value){
            li.parentNode.parentNode.className = 'fail';
        }
        return li;
    }
    this.test(name, fn){
        //I have an UL element with ID "results"
        results = document.getElementById('results');

        //but i will create another UL element
        var ul = document.createElement('ul');

        /*and here my trouble, I don't understand the sense of change
        the value of "results" variable, and why the reference to "results" ul element
        still serves, could you explain me that please?*/
        results = assert(true, name).appendChild(ul);
        fn();
    }
})();
//and here my library working
window.onload = function(){
    test('first test', function(){
        assert(2 + 2 == 4, 'True assertion');
    });
}
我的大问题是理解它是如何工作的变量“结果”的变化

来自

//I have an UL element with ID "results"
results = document.getElementById('results');

results = assert(true, name).appendChild(ul);

我理解assert方法创建了li元素,但我不理解为什么对结果的引用仍然有效。请向我解释。

是否要附加从断言返回的li结果

results = ul.appendChild(assert(true,name));

立即调用的函数表达式(IIFE)后面的行:

在函数的执行上下文中创建变量results。此功能:

   this.test(name, fn){
        //I have an UL element with ID "results"
        results = document.getElementById('results');
在其作用域链上具有该执行上下文。外部函数完成后,关系将保持不变,从而创建一个闭包

因此,每次调用test时,它都在访问相同的results变量

我建议你阅读更多关于IIFE和闭包的内容

铌 不能将UL附加到UL,因为它们只能将LI作为元素子节点。此外,假设IIFE中的这一点不合理,因为在严格模式下,它将是未定义的。要解决此问题,请将全局对象传递给IIFE并使用它:

(function (global) {
    var results;

    global.assert = function(value, desc){

 ...

}(this));

结果在函数中声明为
var results
,Javascript使用块函数作用域,因此在块引号函数中,它引用了在函数本身内部创建的新ul。您应该阅读更多关于闭包和执行上下文的内容。这个链接应该会有很大帮助

每次调用函数时,它都会创建一个新的执行上下文,在该上下文中放置函数,执行函数,变量result在内部声明为private,然后在创建的新块范围内为同一个private变量提供一个新引用,并将ul附加到results变量


results=assert(true,name).appendChild(document.createElement('ul'))时,更新
this.test()
范围中的results变量,并且由于
this.assert()
返回
li
元素,
ul
被附加到
结果(现在是document.getElementById('results'))
因此,在由
this.assert()创建的
li
内部提供一个新的
ul
。您不能将ul附加到ul,因为ul只能有li元素子节点。是否要附加从assert返回的li结果?+1用于书籍。。我也在读这本书……Javascript忍者的秘密……哈哈,你在哪里?(在书上?)就在你读到的地方,很有趣,那么undersand的关键就是闭包?闭包就像Javascript的核心,如果你知道如何正确操作闭包,那么你就是一个真正的Javascript程序员。谢谢你编辑我的答案。我也想这么做,但无法登录:)
(function (global) {
    var results;

    global.assert = function(value, desc){

 ...

}(this));