Javascript eval()在全局上下文和函数上下文中的奇怪行为。IE9&;IE10

Javascript eval()在全局上下文和函数上下文中的奇怪行为。IE9&;IE10,javascript,internet-explorer-9,jscript,Javascript,Internet Explorer 9,Jscript,我在全局上下文中调用了eval()函数,代码如下: eval( (new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile("/BaseScripts/sft.js", 1).ReadAll(), ); 之后,“sft.js”脚本文件中的所有局部变量、函数和对象都将添加到我的全局上下文中。但如果在本地函数中执行相同的eval调用: function run_eval(path) { eval( (new ActiveXO

我在全局上下文中调用了eval()函数,代码如下:

eval( (new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile("/BaseScripts/sft.js", 1).ReadAll(),  );
之后,“sft.js”脚本文件中的所有局部变量、函数和对象都将添加到我的全局上下文中。但如果在本地函数中执行相同的eval调用:

function run_eval(path) {
   eval( (new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile(path, 1).ReadAll(),  );
}

run_eval("/BaseScripts/sft.js");
“sft.js”脚本文件中的局部变量、函数和对象将不会添加到我的全局上下文中。为什么?根据文档,这两个调用都是针对全局对象建立的。为什么只有第一次调用才会将“sft.js”脚本文件中的变量添加到全局对象?不要保存该情况,并在全局上下文中显式调用
run\u eval()

   run_eval.call(this, "/BaseScripts/sft.js");
   //or
   run_eval.call(RuntimeObject(), "/BaseScripts/sft.js");
这两个调用都是按结果相等于
run_eval(“/BaseScripts/sft.js”)。
欢迎发表任何意见?

鉴于此库(lib1.js):

,此主脚本(main.js):

,输出“TopLevelEval”:

,并输出“EvalInFunction”:

我们有证据证明

  • 你是对的-函数中的“this”是“global this”,而方法中的“this”不是。因此loadLib()可以访问全局上下文
  • 从概念上讲,eval就像手工输入代码,而不是函数调用
  • 通过直接在loadLib()中编写/评估
    goLib1={'name':'lib1',…
    (in),您可以更改全局上下文,因为
    var
    的含义并不存在(显然对于语言学家、哲学家或心理医生来说)是“请将此变量放入此变量”
  • 通过直接在loadLib()中编写/计算
    函数f1(){…
    (in),您的操作与编写
    函数flocal(){…
    -您定义了loadLib()的本地函数,该函数在loadLib()的作用域之外不应该(也不应该)可见
  • 如果要使库中的函数可以从导入函数的“外部”访问,可以使用类似于
    this.f1=f1;
    -所有这些的赋值,因为在J(ava)脚本中没有“local”关键字,因此可以删除该关键字以使函数成为全局函数
  • 反之亦然
// no "var" variables go into the GLOBAL OBJECT/SCOPE
goLib1 = {'name' : 'lib1', 'version' : '0.01', 'check' : function() {return goRoot === this;}};

// functions go into the CURRENT OBJECT/SCOPE
function f1() {
  return "f1";
}

function f2() {
  return "f2";
}
// globals (no "var" + prefix to leave no room for doubt
goFS  = new ActiveXObject("Scripting.FileSystemObject");
goRoot = this;
goAct = "TopLevelEval";
//goAct = "EvalInFunction";

// should be variadic
function print(x) {
  WScript.Echo(x);
}

// 'import' a library/module; hint wrt 'export'
function loadLib(lib) {
  function flocal() {
    return "I'm a local function in function loadLib()";
  }
  eval(goFS.OpenTextfile(lib).ReadAll());
  print("in loadLib: f(1) => " + f1() + " f2() => " + f2());
  print("flocal() = " + flocal());
  print("goRoot === this: " + (goRoot === this));
  // 'export' function(s)
  //this.f1 = f1;
  goRoot.f1 = f1;
}

print(goAct);
if (goAct == "TopLevelEval") {
  eval(goFS.OpenTextfile(".\\lib1.js").ReadAll());
} else {
  loadLib(".\\lib1.js");
}

print("loaded library " + goLib1.name + " v. " + goLib1.version + " 'goRoot === this'-check: " + goLib1.check() + 

")");
print("typeof f1: " + (typeof f1));
print("typeof f2: " + (typeof f2));
print("typeof flocal: " + (typeof flocal));
TopLevelEval
loaded library lib1 v. 0.01 'goRoot === this'-check: false)
typeof f1: function
typeof f2: function
typeof flocal: undefined
EvalInFunction
in loadLib: f(1) => f1 f2() => f2
flocal() = I'm a local function in function loadLib()
goRoot === this: true
loaded library lib1 v. 0.01 'goRoot === this'-check: false)
typeof f1: function
typeof f2: undefined
typeof flocal: undefined