Javascript bind()有奇怪的语法问题

Javascript bind()有奇怪的语法问题,javascript,Javascript,为什么在这个示例中,myFunction1抛出语法错误,而myFunction2运行良好?他们不应该都一样吗 (函数(){ 函数MyClass(){ this.val=“myVal”; 这个.myFunction1(); this.myFunction2(); } MyClass.prototype.myFunction1=函数(){ 函数otherFn(){ console.log(this.val); }.约束(本); 其他fn(); } MyClass.prototype.myFunct

为什么在这个示例中,myFunction1抛出语法错误,而myFunction2运行良好?他们不应该都一样吗

(函数(){
函数MyClass(){
this.val=“myVal”;
这个.myFunction1();
this.myFunction2();
}
MyClass.prototype.myFunction1=函数(){
函数otherFn(){
console.log(this.val);
}.约束(本);
其他fn();
}
MyClass.prototype.myFunction2=函数(){
var otherFn=函数(){
console.log(this.val);
}.约束(本);
其他fn();
}
var ins=new MyClass();
})();
这是不对的

只是当首先运行第一个函数时,代码会中断,然后停止执行。所以你永远不会完成你的第二个功能

试一试

相反

这是不对的

只是当首先运行第一个函数时,代码会中断,然后停止执行。所以你永远不会完成你的第二个功能

试一试


相反。

这里的区别是函数声明和函数表达式之间的区别

您的
function1
使用函数声明:

函数声明不是表达式,也不会在代码的逐步执行中发生。在进入范围时,首先完成这些操作

因为它们不是表达式,所以没有值,所以
.bind
无法处理

第二个示例使用函数表达式:

因为这是一个表达式,所以在代码的逐步执行中对其求值,并有一个结果值,
.bind
可以对其进行操作

那么为什么第一个是声明呢?纯粹是因为JavaScript的解析规则是如何定义的。如果在需要语句时遇到
function
,则会启动函数声明。如果在需要表达式的位置遇到
函数
,则会启动函数表达式

function1
中,
function
出现在预期语句的位置,因此是一个声明。但是,在
function2
中,它出现在
var otherFn=
之后,因此只能是一个表达式



(*“where a statement is expected”在JavaScript中,任何表达式[函数表达式除外]在需要语句的地方都是允许的,它被称为ExpressionStatement。因此,它最终是“where a statement or non function expression is expected”。但反过来则不是真的,当需要表达式时,语句无效。)

这里的区别是函数声明和函数表达式之间的区别

您的
function1
使用函数声明:

函数声明不是表达式,也不会在代码的逐步执行中发生。它们是在进入作用域时首先完成的

因为它们不是表达式,所以没有值,所以
.bind
无法处理

第二个示例使用函数表达式:

因为这是一个表达式,所以在代码的逐步执行中对其求值,并有一个结果值,
.bind
可以对其进行操作

那么为什么第一个是一个声明呢?完全是因为JavaScript的解析规则是如何定义的。如果在需要语句时遇到
function
,它将启动一个函数声明。如果在需要表达式的地方遇到
function
,它将启动一个函数表达式

function1
中,
function
出现在预期语句的位置,因此是一个声明。但在
function2
中,它出现在
var otherFn=
之后,因此只能是一个表达式



(*“where a statement is expected”在JavaScript中,任何表达式[函数表达式除外]在需要语句的地方都是允许的,它被称为ExpressionStatement。因此,它最终是“where a statement or non function expression is expected”。但反过来则不是真的,当需要表达式时,语句无效。)这是由于javascript解析代码的原因。Function1中的otherFn是parseTime函数,因此我们当时无法绑定上下文。其中,函数2中的as otherFn是一个运行时函数,因此我们可以绑定上下文。因此,如果要调用函数1中的otherFn,请使用以下语法


otherFn.call(this)
在Function1的otherFn中,它将在运行时绑定上下文。

这是由于javascript解析代码的原因。Function1中的otherFn是一个parseTime函数,因此我们当时无法绑定上下文。其中,函数2中的as otherFn是一个运行时函数,因此我们可以绑定上下文。因此,如果要调用函数1中的otherFn,请使用以下语法


otherFn.call(this)
在Function1的otherFn中,它将在运行时绑定上下文。

两个函数当前都抛出语法错误,只是代码在遇到第一个错误后停止执行。函数otherFn(){console.log(this.val);}.bind(this);语法不正确。@Strandkid:不,功能2
一个很好。检查这把小提琴:@T.J.Crowder确实是我的错,读代码太快了。虽然这两个函数都声明为内联的。这两个函数当前都会抛出语法错误,但它只是提示代码在遇到第一个错误后停止执行。函数otherFn(){console.log(this.val);}.bind(this);语法不正确。@Strandkid:不,功能2一个很好。检查这把小提琴:@T.J.Crowder确实是我的错,读代码太快了。虽然这两个函数都是内联的。我真正想知道的是为什么第一个是不正确的,而另一个是正确的:)@przemoo83好的,在这种情况下,T.J Crowder的答案会适合你的需要。我真正想知道的是为什么第一个是不正确的
function otherFn() {
    console.log(this.val);
}.bind(this);
var otherFn = function() {
    console.log(this.val);
}
otherFn.call(this);
MyClass.prototype.myFunction1 = function(){
  function otherFn() {
    console.log(this.val);
  }.bind(this);
  otherFn();
}
MyClass.prototype.myFunction2 = function(){
  var otherFn= function() {
    console.log(this.val);
  }.bind(this);
  otherFn();
}