编程语言
首页 > 编程语言> > 为什么javascript可以持久化外部函数中发生的局部变量重新分配而不必捕获返回值?

为什么javascript可以持久化外部函数中发生的局部变量重新分配而不必捕获返回值?

作者:互联网

我是一个ruby程序员,所以如果您有这样的事情,我通常来自哪里:

  def addone(x)
    x+1
  end

  def ruby_assignment_behavior(x)
    addone(x)
    puts "x equals " + x
  end

运行最后一个方法将导致以下结果:

ruby_assignment_behavior(1)
#=> "x equals 1"

我认为在javascript中,与此等效的东西将返回x等于2.

在研究了这段代码(获取用户gps坐标)后,我发现了这种独特的javascript质量(相对于ruby)

var currPosition;
navigator.geolocation.getCurrentPosition(function(position) {
    updatePosition(position);
    $("#lat").html(position.coords.latitude;);
    $("#lng").html(position.coords.longitude);  
};

function updatePosition(position) {
    currPosition = position;
}

为什么在getCurrentPosition函数中,即使position是闭包()内的局部变量,也会使用updatePosition()的返回值来更新position变量?

也:
我很好奇,在javascript代码示例中,是否有必要在getCurrentPosition之外使用该updatePosition函数,如果需要,为什么会这样呢?在最外部作用域中定义的currPosition变量是否以某种方式带有重新分配的位置值?

解决方法:

这两段代码非常不同.在Ruby代码中,您正在更改变量值.由于变量是局部变量,因此请正确声明,更改不会反映在范围之外.

在您的JavaScript代码中,您正在更改变量所指向的对象的内部状态.变量本身不会更改.

在这方面,Ruby和JavaScript的行为相同.

var a = { count: 0 };
function increment(x) {
  x.count++; // variable changed, changing referenced object state
}
increment(a);
console.log(a.count);
// => 1

相当于

a = { count: 0 }
def increment(x)
  x[:count] += 1 # variable changed, changing referenced object state
end
increment(a)
puts a[:count]
# => 1

var b = { count: 0 };
function increment(x) {
  x = { count: x.count + 1 }; // changing variable's reference
}
increment(b);
console.log(b.count);
// => 0

相当于

b = { count: 0 }
def increment(x)
  x = { count: x[:count] + 1 } # changing variable's reference
end
increment(b)
puts b[:count]
# => 0

函数外部的var currPosition声明变量currPosition的作用域比该函数宽,这有点像,但不完全像在Ruby中使用$currPosition一样.这允许函数将值分配给一个可见的变量,并将其覆盖:

var c = 0; // outer scope
function update() {
  c = 1;
}
update();
console.log(c);
// 1

function update() {
  var d = 0; // inner scope
  d = 1;
}
update();
console.log(d);
// undefined

在Ruby中,不允许变量跳转这样的函数(方法)范围,但是您可以使用@a,@@ a或$a来访问外部范围(实例,类或全局):

def update
  c = 1 # local scope
end
update
puts c
# => Error

@d = nil # instance scope
def update
  @d = 1
end
update
puts @d
# => 1

但是,Ruby中的块与JavaScript中的函数具有类似的范围效应:

e = nil # outer scope
1.times do
  e = 1
end
e
# => 1

1.times do
  f = 1 # inner scope
end
f
# => Error

标签:scope,variable-assignment,ruby,javascript
来源: https://codeday.me/bug/20191027/1943425.html