Javascript vue:这在不同的范围内获得相同的对象

Javascript vue:这在不同的范围内获得相同的对象,javascript,vue.js,Javascript,Vue.js,我是Vue的新手。我看到了这样一个演示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> {{fullname}} </div> <script src="https://

我是Vue的新手。我看到了这样一个演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
  {{fullname}}
 </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
  var app = new Vue({
    el:'#app',
    data:{
      firstName: 'first',
      lastName: 'last'
    },
    computed: {
      fullname: {
        get: function(){
          console.log('getter');
          return this.firstName + this.lastName;
        },
        set: function (newValue) {
          console.log('setter:' + newValue);
          let names = newValue.split(' ')
          this.firstName = names[0]
          this.lastName = names[names.length - 1]
        }
      }
    }
  })

</script>
</body>
</html>

标题
{{fullname}}
var app=新的Vue({
el:“#应用程序”,
数据:{
名字:'第一',
姓氏:“last”
},
计算:{
全名:{
get:function(){
log('getter');
返回this.firstName+this.lastName;
},
set:函数(newValue){
log('setter:'+newValue);
让name=newValue.split(“”)
this.firstName=名称[0]
this.lastName=names[names.length-1]
}
}
}
})

如代码所示,有两个子函数get和set。在我看来,这两个函数中的this变量不应该相同(因为它们属于不同的范围)。但效果很好。有什么想法吗?

以这段代码为例。我将在运行时使用来更改

功能测试(){
console.log(this.firstName);
}
test();//未定义

调用({firstName:“Test1”})以这段代码为例。我将在运行时使用来更改

功能测试(){
console.log(this.firstName);
}
test();//未定义

调用({firstName:“Test1”})你有一个很大的误解<代码>此
与范围无关。它与绑定有关

什么是范围 让我们暂时不要使用CS语言,用正常的语言交谈。作用域决定是否可以访问变量。换句话说,它决定了变量的“全局性”和“局部性”

例如:

let x = 0;

function foo () {
    let y = 0;
}
foo = {
    a: function () {},
    b: 0
}

bar = Object.create(foo); // create new instance of object foo

foo.a(); // here the function a() is bound to foo
bar.a(); // here the function a() is NOT bound to foo

let x = bar.b; // here we are NOT accessing foo.b!
x
在全局范围和
foo()内部都在范围内<另一方面,code>y
仅在
foo()
的范围内,在其范围外不可访问

什么是绑定 绑定与范围无关(从程序员的角度)*。绑定确定属性属于哪个对象

例如:

let x = 0;

function foo () {
    let y = 0;
}
foo = {
    a: function () {},
    b: 0
}

bar = Object.create(foo); // create new instance of object foo

foo.a(); // here the function a() is bound to foo
bar.a(); // here the function a() is NOT bound to foo

let x = bar.b; // here we are NOT accessing foo.b!
这是一种引用对象自身绑定的机制。当从属于同一对象的方法中调用时,它允许您编写
this.a()
,而不是
foo.a()
bar.a()

所以当然是一样的。它们都绑定到同一个对象:
fullname

*
注意:我说的是从程序员的角度来看,因为javascript规范是从编译器编写者的角度编写的,它将作用域和绑定的概念合并到称为上下文的东西中(有时称为“作用域”,所以是的,在规范中“作用域”有时并不意味着作用域,而是意味着绑定)


你有一个很大的误解<代码>此
与范围无关。它与绑定有关

什么是范围 让我们暂时不要使用CS语言,用正常的语言交谈。作用域决定是否可以访问变量。换句话说,它决定了变量的“全局性”和“局部性”

例如:

let x = 0;

function foo () {
    let y = 0;
}
foo = {
    a: function () {},
    b: 0
}

bar = Object.create(foo); // create new instance of object foo

foo.a(); // here the function a() is bound to foo
bar.a(); // here the function a() is NOT bound to foo

let x = bar.b; // here we are NOT accessing foo.b!
x
在全局范围和
foo()内部都在范围内<另一方面,code>y
仅在
foo()
的范围内,在其范围外不可访问

什么是绑定 绑定与范围无关(从程序员的角度)*。绑定确定属性属于哪个对象

例如:

let x = 0;

function foo () {
    let y = 0;
}
foo = {
    a: function () {},
    b: 0
}

bar = Object.create(foo); // create new instance of object foo

foo.a(); // here the function a() is bound to foo
bar.a(); // here the function a() is NOT bound to foo

let x = bar.b; // here we are NOT accessing foo.b!
这是一种引用对象自身绑定的机制。当从属于同一对象的方法中调用时,它允许您编写
this.a()
,而不是
foo.a()
bar.a()

所以当然是一样的。它们都绑定到同一个对象:
fullname

*
注意:我说的是从程序员的角度来看,因为javascript规范是从编译器编写者的角度编写的,它将作用域和绑定的概念合并到称为上下文的东西中(有时称为“作用域”,所以是的,在规范中“作用域”有时并不意味着作用域,而是意味着绑定)


在运行时确定。这取决于函数的调用方式。对不起,我不明白你的意思。你能详细解释一下吗?
这是在运行时确定的。这取决于函数的调用方式。对不起,我不明白你的意思。请注意,这不仅适用于Javascript,而且适用于所有面向对象的语言。是的,在java和C++语言中,人们混淆了范围和绑定,并把所有的“范围”都称为“范围”,在爪哇,它不让人困惑,它不允许你在类之外声明变量——因此实际上java没有全局范围——这意味着它不需要范围,只需要绑定。所以在Java中调用绑定范围并不令人困惑。非常感谢,您的解释对我帮助很大!请注意,这不仅适用于Javascript,而且适用于所有面向对象的语言。是的,在java和C++语言中,人们混淆了范围和绑定,并把所有的“范围”都称为“范围”,在爪哇,它不让人困惑,它不允许你在类之外声明变量——因此实际上java没有全局范围——这意味着它不需要范围,只需要绑定。所以在Java中调用绑定范围并不令人困惑。非常感谢,您的解释对我帮助很大!