JavaScript CoffeeScript 闭包参数作用域的问题

siyang1982 · 2012年05月27日 · 最后由 siyang1982 回复于 2012年05月28日 · 4015 次阅读

打算玩玩 CoffeeScript,改写之前代码,在闭包时遇到问题。 如:

var test = (function(){
  var a, b
  return {
     i: function(){
        a = 1
     },
     j: function(){
        console.log(a)
     }
  }
})()
test.i()
test.j()

因为 CoffeeScript 里默认都为局部变量, 我尝试过用 @,但必须与 this 绑定,而且实际应用中可能会有 function 的多层嵌套。

PS: 发现 a,b 置初始值即可解决作用域问题。 不过如果无须初始值,再像下面这么定义有些难看:

a = null
b = null

请问有没有更好的方法?

匿名 #1 · 2012年05月27日

用面向对象的思维进行函数式编程

a = b = null

It's my way...

以前也有这个疑问,没有找到更美观的方法

#1 楼 @sharp 因为这个方法很好用。。。

#2 楼 @clearJiang 很有意思 的确很激进。

#3 楼 @clc3123 官方文档和 issue 都没找到解决方法,看来我们的需求被忽视了

可以用形参来省掉变量声明

var test = (function(a, b){
  return {
     i: function(){
        a = 1
     },
     j: function(){
        console.log(a)
     }
  }
})()

coffeescript 没用过,在官网上试了一下,只知道下面几种方式。感觉不是那么 coffeescript

test1 = ((a, b) -> 
  i: -> a = 1
  j: -> console.log(a)
)()

test2 = do (a = null, b = null) ->
   i: -> a = 1
   j: -> console.log(a)


test3 = (a, b) ->
   i: -> a = 1
   j: -> console.log(a)

test3 = test3()

个人觉得没有必要过分追求代码的美观 a = b = null 意思明了,也没有多难看

#5 楼 @john1king 多谢。之前想过形参的方法,不过感觉有歧义。 看来现在最合适的方法还是a = b = null

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册