函数如何在<script>标记内作用域/命名空间?

Sco*_*son 5 javascript jquery knockout.js

我正在使用Knockout.js和jQuery构建一个新的应用程序.我更喜欢"use strict"在我的脚本中,但由于我们使用的某些库不能使用,"use strict"所以我必须使用函数形式.

我不喜欢将javascript放在<script>标签内联中,所以我通常将所有内容都放在一个单独的文件中,这样它就可以被预处理器缩小和缩小.

鉴于这些标准,我想知道在脚本标记中创建函数时,默认情况下函数的作用域.现在我正在做这样的事情:

$((function(win) {
    "use strict";

    win.myFunction = function () {
        // do stuff
    };
}(window)));
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将函数放在我的window对象上,因此我可以在我的视图中调用它们.我注意到我可以在我的jQuery模板中调用它们而不限定它们(即:我可以调用它myFunction而不是window.myFunction),但我担心这不适用于浏览器.是否所有浏览器都允许您在没有完全限定名称的情况下调用放置在窗口对象中的函数?我如何在我的匿名方法中将函数放在全局范围内,如上所述?

感谢您的见解!

lon*_*day 6

window对象本质上全局范围.任何未限定为函数的变量都是window对象的属性.

您可以通过将其设置为窗口对象的属性来设置全局变量,就像您要做的那样:

window.myFunction = function() {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

但是,使用名称丢弃全局命名空间可能不是一个好主意.这样就会出现混乱,无法维护的代码和奇怪的错误.例如,所有jQuery函数都是jQuery(或$)对象的属性或子属性.这意味着他们可以定义jQuery.each而不必担心与全局each方法的冲突.您应该考虑对自己的代码执行相同的操作:创建一个全局命名空间对象来容纳所有"全局"方法.