为什么我不能直接声明函数.bind(this)

Sam*_*tar 1 javascript

鉴于以下内容:

function x() {

    this.abc = 1;

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

    var f2 = function b() {
       alert(this.abc);
    }.bind(this);
}
Run Code Online (Sandbox Code Playgroud)

我想要的是外部函数的"this"在f1和f2函数中可用.

为什么VS2013告诉我函数f1()上的bind(this)有语法错误?

Poi*_*nty 5

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

你当然可以这样做:

(function a() {

}).bind(this);
Run Code Online (Sandbox Code Playgroud)

虽然不使用.bind()它的返回值不是很有用.

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


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

现在,通常考虑表达式和参与表达式的事物,重点是计算某种价值.当您需要将值5作为表达式的一部分时,您将5其置于其位置即可.它本身5就是一个有效的表达式,所以这不是语法错误:

5;
Run Code Online (Sandbox Code Playgroud)

那怎么办?它什么都不做.同样,在没有函数声明语句的假想JavaScript中,

function foo(a, b) {
  return a + b;
};
Run Code Online (Sandbox Code Playgroud)

也什么都不做.会发生什么只是函数将被实例化但被抛弃,因为值 - 对实例化函数的引用 - 不保存为变量的值或传递给某个函数或其他任何东西.在这个伪装的JavaScript中,你会使用

var foo = function(a, b) {
  return a + b;
};
Run Code Online (Sandbox Code Playgroud)

每时每刻.

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

请注意,有些JavaScript程序员非常喜欢使用var函数声明.真的是风格问题.