1

我有一个函数接受另一个函数作为参数。外部函数是否有可能在不知道内部函数做什么的情况下运行内部函数,并避免它试图对受保护范围内的任何变量进行任何更改。

注意:我所说的受保护,并不是指 Java、C++ 或 C# 中可用的受保护继承范围说明符。

例子:

假设我有一个函数处理器。

{
 // processor is a function of an object which has input and output be parameters
function processor(functionToExecute)
{
  this.output = functionToExecute(this.input);
}

}

现在我不知道 functionToExecute 会运行什么代码。

我在全局范围内几乎没有变量 a、b 或 c。我不希望它们受到影响,也不希望从 functionToBeExecuted 调用全局范围内的任何其他函数。我只希望它接受参数并给出输出。

但不应产生影响其范围之外的任何事物的副作用。

理想情况下,我将向用户询问此功能并在服务器上运行它以根据用户的需要处理一段数据。

4

1 回答 1

1

函数的作用域是在声明时确定的,而不是在执行时确定的。

var a = 1;
var b = 2;
var b = 3;

function foo(fn){

  //JS is function-scoped. It's the only way you can create a new scope.
  //This is a new scope. It cannot be accessed from the outside
  var a = 4;
  var b = 5;
  var b = 6;

  //We call the passed function. Unless we pass it some references from this scope
  //the function can never touch anything inside this scope
  fn('hello world');
}

foo(function(hw,obj){

  //the function passed is defined here where, one scope out, is the global scope
  //which is also where a, b and c are defined. I can *see* them, thus they are
  //modifiable
  console.log(a,b,c); //123
  a = 7;
  b = 8;
  c = 9;
  console.log(a,b,c); //789

  console.log(hw); //hello world

});

此外,全局变量在代码中的任何位置都可见。任何代码都可以修改全局变量,除了某些情况,比如 WebWorkers,但那是另一回事了。

这是一个如何使用即时函数隐藏值的示例,并且只公开函数以使用它们:

(function(ns){

  var width = 320;
  var height = 240;

  ns.getArea = function(fn){
    fn.call(null,320 * 240);
  }

}(this.ns = this.ns || {}));

//let's get the area
ns.getArea(function(area){
  console.log(area);
});

//In this example, we have no way to modify width and height since it lives inside
//a scope that we can't access. It's modifiable only from within the scope
//or using a "setter" approach like in classical OOP

但是对于对象,它们是通过引用传递的。一旦你将它们传递到某个地方,它们可能会被修改。

于 2013-05-07T09:20:52.683 回答