即使存在,也无法访问窗口级变量。访问时返回undefined

时间:2017-09-14 03:23:35

标签: javascript

我正在尝试在window.onLoad()的脚本中访问窗口级变量,但它总是返回undefined。但是当我控制台登录或尝试只在调试控制台中键入window时,它清楚地向我显示window对象上存在的变量并且具有值。我不清楚为什么会这样,有没有办法访问它?如果我做错了什么并请指出正确的方向,请纠正我。非常感谢任何帮助。

更新:window._vp变量在某个实时网站的脚本中声明,我尝试使用我的chrome扩展程序访问该特定变量。

我的剧本:

window.onload = _ => {
    console.log("window._vp is:", window._vp);
}

网站脚本:

var _vp = {};
_vp['IsDashAvailable'] = false;
//...

您可以在开发工具控制台的以下屏幕截图中看到该行为: enter image description here

谢谢。

1 个答案:

答案 0 :(得分:2)

我认为这是您的扩展程序隔离上下文的问题,详见另一个SO post about Context isolation同样面临相同问题的人。

您应该尝试从其他答案引用的以下方法:

方法2b:使用函数

对于大量代码,引用字符串是不可行的。可以使用函数,而不是使用数组,并使用字符串化:

var actualCode = '(' + function() {
    // All code is executed in a local scope.
    // For example, the following does NOT overwrite the global `alert` method
    var alert = null;
    // To overwrite a global variable, prefix `window`:
    window.alert = null;
} + ')();';

var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.remove();

此方法有效,因为字符串上的+运算符和函数会将所有对象转换为字符串。如果您打算不止一次使用代码,那么创建一个函数以避免代码重复是明智的。实现可能如下所示:

function injectScript(func) {
    var actualCode = '(' + func + ')();'
    ...
}
injectScript(function() {
   alert("Injected script");
});

注意:由于函数是序列化的,原始范围和所有绑定属性都将丢失!

var scriptToInject = function() {
    console.log(typeof scriptToInject);
};
injectScript(scriptToInject);
// Console output:  "undefined"