设置局部变量时非常奇怪的JavaScript行为



我一直在尝试完善 SO 问题的答案,但我遇到了一个奇怪的问题,我希望有人能帮助我了解原因。我正在尝试做的是通过用本地范围的变量覆盖它们来禁用"受保护"函数中的 AJAX 操作。这需要与 jQuery 等库一起使用,所以我尝试实现逻辑来重新创建 $ 变量,但由于某种原因,我无法像其他版本那样用本地版本覆盖全局范围,同时产生了一些非常意外(和有趣)的行为。

这是我正在使用的代码:

var testFunction = (function(){
    // Global to local/lexical:
    var XMLHttpRequest = undefined;
    var eval = undefined;
    var setTimeout = undefined;
    var setInterval = undefined;
    var Function = undefined;
    var window = undefined;
    // Can't set directly to var $?
    var $new = (function($old){ if($old) {
        var newjq = function(s, c) {
            // Reroute main function
            return $old(s, c);
            };
        var jQueryBlacklist = {
            // Initialize blacklist
            "ajax": true,
            "post": true,
            "get": true,
            "getJSON": true,
            "getScript": true
            };
        for(i in $old) // Reconstruct Object
         if($old.hasOwnProperty(i)
         && !jQueryBlacklist[i])
          newjq[i] = $old[i];
        return newjq;
        } }($));
    // Line below completely breaks script?:
    var $ = $new;
    if(!$new) alert("$new is undefined");
    // Real testFunction() below:
    return function() {
        // AJAX-forbidden code
        if(!$) alert("$ is undefined");
        else alert("jQuery is working");
        // alert($.ajax);
        // $.ajax should be undefined
        }
    }());
testFunction();
// alert($.ajax);
// should be defined

您可以单击此处查看小提琴。

我只是对有关此的任何反馈感兴趣,因为对我来说这似乎是一个错误。我很想知道这种行为的原因。提前感谢!

您的var $正在被提升(声明被移动到函数的顶部),将全局$隐藏为未定义(当它被传递到自执行函数时),直到它在var $ = new$中实际分配。

最简单的解决方案是将jquery传递到你的模块中。

var testFunction = (function ($) {
    // Global to local/lexical:
    var XMLHttpRequest = undefined;
    var eval = undefined;
    var setTimeout = undefined;
    var setInterval = undefined;
    var Function = undefined;
    var window = undefined;
    // Can't set directly to var $?
    var $new = (function ($old) {
        if ($old) {
            var newjq = function (s, c) {
                // Reroute main function
                return $old(s, c);
            };
            var jQueryBlacklist = {
                // Initialize blacklist
                "ajax": true,
                    "post": true,
                    "get": true,
                    "getJSON": true,
                    "getScript": true
            };
            for (i in $old) // Reconstruct Object
            if ($old.hasOwnProperty(i) && !jQueryBlacklist[i]) newjq[i] = $old[i];
            return newjq;
        }
    }($));
    // Line below only affects the object reference passed in to this module
    // Doesn't affect jQuery outside of this function:
    $ = $new;
    if (!$new) alert("$new is undefined");
    // Real testFunction() below:
    return function () {
        // AJAX-forbidden code
        if (!$) alert("$ is undefined");
        else alert("jQuery is working");
        // alert($.ajax);
        // $.ajax should be undefined
    }
}(jQuery));
testFunction();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

相关内容

  • 没有找到相关文章

最新更新