2015-09-13 148 views
0

所以,我有这样的代码:如何减少Javascript中的内部函数变量的范围?

var exampleModule = (function() { 
    var example = {}; 

    var self = this; 

    example.test = function() { 
    this.mousedown = function (e) { 
     self.x1 = e.offsetX; 
     self.y1 = e.offsetY; 
    }; 

    this.mousemove = function(e) { 
     // do something with x1 and y1 and e.offsetX and e.offsetY 
    }; 
    }; 
})(); 

我想有x1y1只能example.test内作用域。有没有办法做到这一点this或我必须做一些像example.test.x1为每一个?目前他们的范围是整个exampleModule,我想把它缩小到只有example.test

我只是有点理解整个self/that = this;口头禅。我知道Javascript有这个bug,其中this当一个函数中的某个函数引用全局范围时,但是当上面的例子中有3个函数时什么时候?什么是this等于嵌套三个或四个功能下来?

+0

*“我想让x1和y1仅在example.test范围内”*您是什么意思?你不希望他们也在'exampleModule'上? –

+0

@ T.J.Crowder:对! –

+0

ES6解决了以前与Js全局范围和功能范围有关的本地范围问题。要使用新功能,只需使用关键字let替换每个var关键字。假设你的变量的范围是它们被声明的地方,即它们被声明的大括号内。不幸的是,你必须使用babel或类似的代码来传输你的代码,因为浏览器不完全支持这一点。 –

回答

4

您可以使用您已经拥有的example.test()功能的中间范围和存储的变量有:

var exampleModule = (function() { 
    var example = {}; 

    var self = this; 

    example.test = function() { 
    var x1, y1; 
    this.mousedown = function (e) { 
     x1 = e.offsetX; 
     y1 = e.offsetY; 
    }; 

    this.mousemove = function(e) { 
     // do something with x1 and y1 and e.offsetX and e.offsetY 
    }; 
    }; 
})(); 

注:这种设计模式是常有的问题,充满因为这假定之前,你总是会得到一个鼠标按下一个鼠标移动,显然并非总是如此。因此,您将在mousemove处理程序中仔细地编写代码,以确保您使用的是之前设置的适当值。

另外,它看起来并不像在example.testthis值可能是你希望它是什么,而是你还没有真正纳入你的那部分代码足够的信息让我们知道你的意图是什么。

this在Javascript中是通过调用函数的方式来设置的,并且在ES5中的每个函数调用中都设置了一个新值(ES6中的箭头函数是一个例外)。所以,在你的mousedown处理程序中,它将由如何调用这个方法来设置。总结了thisthis answer中设置的各种方式。

+0

好的,所以我只是试了一遍(因为我曾尝试过),它似乎并没有工作。该值不会在'mousedown'和'mousemove'之间持续。我也认为这会奏效,不知道为什么它不会。 –

+0

好吧,我想通了,但解决方案有点超出了问题的范围。它不工作的原因是因为在另一个文件中,我每次都在该函数上调用'new',而不是将其预加载到字典中,以便值重置。 –