使用(function())时,JavaScript不再起作用

时间:2015-07-02 10:50:54

标签: javascript jquery

我对TypeScript很陌生,我会尝试通过它来学习JavaScript。 由于我是一名.NET程序员,我可以在TypeScript中创建类,然后让TypeScript编译器神奇地将它转换为JavaScript,毕竟我想使用JavaScript生成的文件。这将有助于我学习JavaScript。

现在,我是一个简单的类,用于对方法参数执行验证。 打字稿实现如下:

class Guard {
    static ThrowIfNull(argument, argumentName) {
        if (argument == null) { throw "The argument '" + argumentName + "'      cannot be null."; }
    }   
}

在TypeScript游乐场上,这会生成以下JavaScript:

var Guard = (function () {
    function Guard() {
    }
    Guard.ThrowIfNull = function (argument, argumentName) {
        if (argument == null) {
            throw "The argument '" + argumentName + "' cannot be null.";
        }
    };
    return Guard;
})();

所以,现在我确实希望在我的Web应用程序中使用这段JavaScript代码,而不是TypeScript代码。

我已经创建了一个jsFiddle,以便更容易理解。

现在,我已经在您的JavaScript中阅读过,您可以更好地将所有内容包装在function中,如下所示:

(function() {
    'use strict';

    -- Code goes here.
})();

有关更新的代码,请参阅此JsFiddle。 但是,现在当我运行我的应用程序时,我得到了一个未定义的警告。' 有人可以向我解释为什么会这样吗?

我假设我必须删除(function()){})();然后,但这意味着我最初误解了这个概念,那么将所有内容包装在这样一个函数中的目的是什么?

修改 如果我删除了函数包装器,那么JShint会产生一个错误,告诉我应该使用'使用strict'的表单函数。

感谢您帮助我。

2 个答案:

答案 0 :(得分:1)

var Guard = (function () {
    "use strict";
    function Guard() {
    }
    Guard.ThrowIfNull = function (argument, argumentName) {
        if (argument == null) {
            throw "The argument '" + argumentName + "' cannot be null.";
        }
    };
    return Guard;
})();

对于你正在尝试做的事情已经足够了......进一步将其包装在

(function () {

})();

将使Guard仅在该范围内可见 - 这不是您想要实现的目标

答案 1 :(得分:0)

如果代码块只有一个责任,你应该只将事物包装在一个函数中,并且你将一次又一次地将它用于特定目的。例如,隐藏/显示DOM元素的函数。

function toggle(id){
    $('#' + id).toggle();
} 

您封装了隐藏/显示功能,因为您可能需要这样的通用函数来处理任何DOM元素。

如果您只想运行一些说明,则应将它们写在脚本标记内:

<script type="text/javascript">
    var lang = 'en';
    doThis();
    doThat();
    var Guard = function () {
       //////
    };
</script>

如果你在函数内部编写所有内容,那么你会遇到很多问题。特别是关于可变范围,就像你现在一样。请阅读:What is the scope of variables in JavaScript?