2017-08-03 145 views
1

任何人都可以解释这个函数的作用。 我不明白函数定义解析(组)正在通过的部分'data'Javascript函数返回函数定义

function getData(data) { 
     data = (data === undefined) ? this.defaultData() : data; 

     var self = this; 

     return (function parse(group) { 
      return self.change('groupTo', groupExp, group); 
     }(data)); 
    } 

现在,我知道这是一个IIFE,我想知道现在是'arg'是否可供使用内doSomething()

(function (local_arg) { 
    doSomething(local_arg); 
})(arg); 
+1

如果不是dup,但是[很好的阅读](https:// stackoverflow。COM /问题/ 8228281 /什么 - 是 - 的 - 功能 - 结构 - 在JavaScript的)。 – Teemu

+0

我想你简化了代码,因为如这里所表示的那样,它对于可能非常简单的事情来说过于复杂。你可能会发布(更多)原始代码? – trincot

+0

阅读在[MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions#Function_scope)的答案为已编辑的问题。 – Teemu

回答

1

在这种模式:

(function (local_arg) { 
    doSomething(local_arg); 
})(arg); 

...立即执行的功能,并且参数local_arg将已传递的说法,即arg的值。所以上面是做一样的只是:

doSomething(arg); 

在某些情况下arg是一个比较复杂的表情,而你需要多次使用它,或者你对于只需要知道变量需要在本地,IIFE模式可能有用。

+0

谢谢@trincot.Got我的回答:) – Abhijit

3

这不是一个很好的一段代码。我不知道从哪里开始的不好的做法...

此函数定义一个函数,它不能从任何其他范围内访问,并且不能重复使用,只是为了返回其与数据参数的调用。如果调用getData()功能,无需在函数传递任何参数,则值的数据变量是不确定的外部回流可能是简单

return self.change('groupTo', groupExp, data); 
+0

这是我想了解的一段代码。 – Abhijit

+0

@Abhijit是的。在'group'在'函数解析(组){}'引用'data' – Thomas

1

。 所以在这条线上使用三元运算符。

data = (data === undefined) ? this.defaultData() : data; 

所以它会检查是否data === undefined条件这是真的。因此它将分配的this.defaultData()值到数据属性 总之时的data值是undefined该时间以下是这种情况

data = this.defaultData() 

Otheriwse如果数据具有的值意味着调用函数getData("Hi")与参数那么它将被评估作为

data = data // data = Hi 

现在这里var self = this;是用来保存的this这将在下文中提到嵌套函数内的上下文。

return (function parse(group) { 
     return self.change('groupTo', groupExp, group); 
    }(data)); 

没有自我=这一点,如果我尝试在嵌套函数中使用this然后它会指向全局对象即在JS window对象。

以下代码arg在函数内部是可用的,因为我们在IIFE的调用中传递它,所以传递doSomething函数的调用时可用。

(function (local_arg) { 
    doSomething(local_arg); 
})(arg); 
+0

传递的值要了解如何'this'的行为在JavaScript中阅读这篇文章 http://javascriptissexy.com/understand-javascripts-this -with清晰度和主-IT/ –

+0

采取OP的代码,因为它是'this'将把'window'反正。 – Teemu

+0

是啊目前功能是在外面,所以它会指向窗口。但是,如果此功能使用JavaScript编写的对象,则前后文改变@Teemu –