来自 javascript 忍者秘密书的例子

Example from book secrets of javascript ninja

开始阅读javascript忍者书,我真的不明白为什么在下面的例子中需要'this'这个词。我试过了 w/out 它和代码没有 运行。 'this' 在下面的上下文中有什么作用? 我想我理解 'this'(或者可能根本不理解)但是在下面,我就是不明白。 请告诉我!谢谢。

<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
(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) {
    this.test = function test(name, fn) {
        results = document.getElementById("results");
        results = assert(true,     name).appendChild(document.createElement("ul"));
        fn();
    };
})();

window.onload = function() {
    test("A test", function() {
        assert(true, "First assertion completed");
        assert(true, "Second assertion completed");
        assert(true, "Third assertion completed");

    });

    test("Another stupid test", function() {

        assert(true, "First assertion completed");
        assert(true, "Second assertion completed");
        assert(true, "Third assertion completed");

    });
    test("A third test", function() {
        assert(null, "fail");
        assert(5, "pass")

    });

};
</script>
<style type="text/css">
    #results li.pass { color: green;}
    #results li.fail { color: red;}

</style>
</head>
<body>
<ul id="results"</ul>
</body>
</html>

该代码利用了这样一个事实,即当一个函数处于在没有任何上下文的情况下调用。因此,在第一个函数中,thiswindow,并且 "test" 和 "assert" 符号被绑定为全局变量。

我个人认为这是用于教学目的的一段有问题的代码。我认为这样写初始函数会更好(也更清晰):

(function(global) {
    var results;
    global.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) {
    global.test = function test(name, fn) {
        results = document.getElementById("results");
        results = assert(true,     name).appendChild(document.createElement("ul"));
        fn();
    };
})(this);

以上代码在 "strict" 模式下可以正常工作,并且更明确地全局绑定这些符号。

要更好地了解 this 的工作原理,请查看此相关问题的答案:

How does the "this" keyword work?

这应该会告诉您关于 JavaScript 中 this 的所有您需要了解的(以及更多)信息。