我一直在尝试完善 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>