Javascript 当函数被直接声明时,为什么我不能.bind(这个)

Javascript 当函数被直接声明时,为什么我不能.bind(这个),javascript,Javascript,鉴于以下情况: function x() { this.abc = 1; function f1() { alert(this.abc); }.bind(this) var f2 = function b() { alert(this.abc); }.bind(this); } 我希望外部函数的“this”在f1和f2函数中可用 为什么VS2013告诉我函数f1()上的绑定(this)存在语法错误?函数声明语句和函数实例

鉴于以下情况:

function x() {

    this.abc = 1;

    function f1() {
       alert(this.abc);
    }.bind(this)

    var f2 = function b() {
       alert(this.abc);
    }.bind(this);
}
我希望外部函数的“this”在f1和f2函数中可用


为什么VS2013告诉我函数f1()上的绑定(this)存在语法错误?

函数声明语句和函数实例化表达式之间存在差异。两者都涉及关键字
函数
,但声明语句不能立即用作函数的引用。函数实例化表达式是表达式语法的一部分,因此可以在该上下文中作为函数的引用自由使用,因为它的计算结果就是引用函数

您当然可以这样做:

(function a() {

}).bind(this);
虽然没有使用
.bind()
中的返回值,但它不是很有用

如果语句中的第一个标记是
function
,那么您就得到了一个函数声明语句。如果第一个标记不是
函数
,那么您要么得到了另一种关键字引入语句(
for
return
var
try
,等等),要么得到了表达式语句。在该表达式(或其他上下文中的任何表达式)中,函数实例化是表达式语法的一部分,并且该值可以用作对函数的引用


这是思考这个问题的另一种方式。让我们假设在JavaScript中实例化函数只有一种方法,那就是函数表达式。也就是说,让我们假设
function
关键字的任何使用都意味着实例化一个函数,并将对该函数的引用作为其值返回

现在,大致考虑表达式和表达式中涉及的内容,重点是计算某种值。当您需要值
5
作为表达式的一部分时,您可以将
5
放在它的位置,就是这样。就其本身而言,
5
是一个有效的表达式,因此这不是语法错误:

5;
然而,这有什么用呢?它什么也不做。类似地,在没有函数声明语句的虚构JavaScript中

function foo(a, b) {
  return a + b;
};
也什么都不做。发生的情况很简单,函数将被实例化,但会被丢弃,因为值(对实例化函数的引用)不会保存为变量的值,也不会传递给某个函数或其他任何东西。在这个虚构的JavaScript中,您将使用

var foo = function(a, b) {
  return a + b;
};
一直如此

然而,语言设计确实有函数声明语句。作为一种简化方法,该语言仅将其第一个标记为关键字
function
的语句识别为与恰好包含函数实例化的表达式语句完全不同的语句。还有其他方法可以解决这个问题(例如使用不同的关键字),但我怀疑仍然会有混淆


请注意,有些JavaScript程序员非常喜欢对函数使用
var
声明。这实际上是风格的问题。

函数声明语句和函数实例化表达式之间有区别。两者都涉及关键字
函数
,但声明语句不能立即用作函数的引用。函数实例化表达式是表达式语法的一部分,因此可以在该上下文中作为函数的引用自由使用,因为它的计算结果就是引用函数

您当然可以这样做:

(function a() {

}).bind(this);
虽然没有使用
.bind()
中的返回值,但它不是很有用

如果语句中的第一个标记是
function
,那么您就得到了一个函数声明语句。如果第一个标记不是
函数
,那么您要么得到了另一种关键字引入语句(
for
return
var
try
,等等),要么得到了表达式语句。在该表达式(或其他上下文中的任何表达式)中,函数实例化是表达式语法的一部分,并且该值可以用作对函数的引用


这是思考这个问题的另一种方式。让我们假设在JavaScript中实例化函数只有一种方法,那就是函数表达式。也就是说,让我们假设
function
关键字的任何使用都意味着实例化一个函数,并将对该函数的引用作为其值返回

现在,大致考虑表达式和表达式中涉及的内容,重点是计算某种值。当您需要值
5
作为表达式的一部分时,您可以将
5
放在它的位置,就是这样。就其本身而言,
5
是一个有效的表达式,因此这不是语法错误:

5;
然而,这有什么用呢?它什么也不做。类似地,在没有函数声明语句的虚构JavaScript中

function foo(a, b) {
  return a + b;
};
也什么都不做。发生的情况很简单,函数将被实例化,但会被丢弃,因为值(对实例化函数的引用)不会保存为变量的值,也不会传递给某个函数或其他任何东西。在这个虚构的JavaScript中,您将使用

var foo = function(a, b) {
  return a + b;
};
一直如此

然而,语言设计确实有函数声明语句。作为一种简化方法,该语言仅将其第一个标记为关键字
function
的语句识别为与恰好包含函数实例化的表达式语句完全不同的语句。还有其他方法可以解决这个问题(例如使用不同的关键字),但我怀疑仍然会有混淆

请注意,有些JavaScript程序员非常喜欢使用
var