Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取作用域中的变量,而不使用闭包/包装函数_Javascript_Php_Scope_Closures - Fatal编程技术网

Javascript 获取作用域中的变量,而不使用闭包/包装函数

Javascript 获取作用域中的变量,而不使用闭包/包装函数,javascript,php,scope,closures,Javascript,Php,Scope,Closures,如果我有一个随时间变化的变量,并且我想保留它的一个特定实例,我必须将它封装在一个闭包中,如下所示: 功能测试(){ var x=Math.random(); //是否有使用以下闭包的替代方案: var printnum=(函数(num){ 返回函数(){ console.log(num); } })(this.x);//因为我觉得这很难看 返回printnum; } var a=测试(); var b=测试(); a()//数 a()//同上 b()//不同货号 b()//与上面一样我个人喜欢

如果我有一个随时间变化的变量,并且我想保留它的一个特定实例,我必须将它封装在一个闭包中,如下所示:

功能测试(){
var x=Math.random();
//是否有使用以下闭包的替代方案:
var printnum=(函数(num){
返回函数(){
console.log(num);
}
})(this.x);//因为我觉得这很难看
返回printnum;
}
var a=测试();
var b=测试();
a()//数
a()//同上
b()//不同货号

b()//与上面一样
我个人喜欢IILife,但是“一个人的垃圾…”无论如何,你真的只需要传递一个数字的副本,这样你就不会被闭包变量缠住

功能测试(){
//因为您使用的是一个数字,JavaScript会按值传递所有参数
//号码的副本将传递给助手,允许助手“断开连接”
//从使用父范围中的编号开始
返回帮助程序(Math.random());
函数助手(num){
返回函数(){console.log(num);}
}
}
var a=测试();
var b=测试();
a()//数
a()//同上
b()//不同货号

b()//与上面一样
我个人喜欢IILife,但是“一个人的垃圾…”无论如何,你真的只需要传递一个数字的副本,这样你就不会被闭包变量缠住

功能测试(){
//因为您使用的是一个数字,JavaScript会按值传递所有参数
//号码的副本将传递给助手,允许助手“断开连接”
//从使用父范围中的编号开始
返回帮助程序(Math.random());
函数助手(num){
返回函数(){console.log(num);}
}
}
var a=测试();
var b=测试();
a()//数
a()//同上
b()//不同货号

b()//同上
您可以使用es6吗?如果是,箭头函数将给出相同的结果,但更简洁:

功能测试(){
var x=Math.random();
var printnum=x=>()=>console.log(x);
返回printnum(x);
//或者您可以立即调用:
//var printnum=(x=>()=>console.log(x))(x);
//返回printnum;
}
var a=测试();
var b=测试();
a()//数
a()//同上
b()//不同货号

b()//同上
您可以使用es6吗?如果是,箭头函数将给出相同的结果,但更简洁:

功能测试(){
var x=Math.random();
var printnum=x=>()=>console.log(x);
返回printnum(x);
//或者您可以立即调用:
//var printnum=(x=>()=>console.log(x))(x);
//返回printnum;
}
var a=测试();
var b=测试();
a()//数
a()//同上
b()//不同货号

b()//与上面相同
不需要
printnum
函数。只需返回内部匿名函数

这本质上与PHP相同,但它不需要
use()
声明来列出要继承到闭包中的变量(PHP需要这样做,因为默认情况下不允许访问外部变量)

功能测试(){
var x=Math.random();
返回函数(){
控制台日志(x);
}
}
var a=测试();
var b=测试();
a()//数
a()//同上
b()//不同货号

b()//与上面相同
不需要
printnum
函数。只需返回内部匿名函数

这本质上与PHP相同,但它不需要
use()
声明来列出要继承到闭包中的变量(PHP需要这样做,因为默认情况下不允许访问外部变量)

功能测试(){
var x=Math.random();
返回函数(){
控制台日志(x);
}
}
var a=测试();
var b=测试();
a()//数
a()//同上
b()//不同货号
b()//同上
使用.bind()(ES5)删除包装函数并避免关闭的简单方法:

function test(){
  return console.log.bind(console, Math.random());
}
使用.bind()(ES5)删除包装函数并避免关闭的简单方法:

function test(){
  return console.log.bind(console, Math.random());
}

我给了你一个可以接受的答案:“好吧,在javascript中,你必须以这样或那样的方式将x传递到函数中。”。非常感谢。es6的一个很好的例子。我为您提供了一个公认的例子:“好吧,在javascript中,您必须以某种方式将x传递到函数中。”。非常感谢。es6的好例子。感谢您的输入。我给了你一分。您演示了与CRice基本相同的过程,但使用的是老式javascript。本质上,没有办法摆脱闭包,只显式地声明你的作用域而不使用包装函数构建作用域。@adjenks这是正确的,为什么我说你必须复制这个数字。JavaScript是词汇范围的,词汇范围导致闭包,这是无法回避的事实。感谢您的输入。我给了你一分。您演示了与CRice基本相同的过程,但使用的是老式javascript。本质上,没有办法摆脱闭包,只显式地声明你的作用域而不使用包装函数构建作用域。@adjenks这是正确的,为什么我说你必须复制这个数字。您无法回避这样一个事实:JavaScript是词汇范围的,词汇范围导致闭包。感谢您提供的示例。在我的示例中,我忘了使用
this.x
来演示我想要捕获处于特定状态的变量,而该变量可能是静态的。我想你可以把它赋给一个新的变量,比如
vary=x
然后在函数中使用
y
。这个.x应该是什么?你的代码中没有对象。您是否还打算编写
newtest()
?但是如果使用
newtest()
,它将返回对象,而不是函数。所以不清楚你在修改后的问题中真正想做什么。在Javscript中,一切都是一个对象,哈。好吧,不是所有的,但函数是。I j