首先,我认识到在method.this vs var方法等方面有100多个线程。这不是我要问的。我知道不同之处。在使用构造函数创建对象的上下文中,我对函数表达式VS函数声明 感到困惑。
我想知道的是:为什么函数声明永远不会出现在构造函数中,但是函数表达式呢?每当我声明一个函数而不是使用一个表达式时,一旦启动它就无法在对象中访问它;这是为什么?
我认为这是因为它是本地的(也就是私有的)因此无法访问,或者在创建对象时,如果构造函数没有看到前缀为'这个',' var&#的函数39;或者' constructor.prototype',它会跳过它。
答案 0 :(得分:4)
为什么函数声明永远不会出现在构造函数中,但是函数表达式呢?
他们
每当我声明一个函数而不是使用一个表达式时,一旦启动它就无法在对象中访问它;这是为什么?
你一定做错了。
function Thing() {
function go() {
alert('Hello');
}
this.foo = 1;
this.bar = function () {
go();
}
}
var x = new Thing();
x.bar();
我认为这是因为它是本地的(也就是私人的)因此无法访问
函数声明是本地作用域。这并不会阻止您将它们分配到更广泛的范围,对象属性或在声明范围内使用它们。
答案 1 :(得分:1)
为什么函数声明永远不会出现在构造函数中,但是函数表达式呢?
他们这样做。您可以使用等效的函数声明轻松替换每个函数表达式。
每当我声明一个函数而不是使用一个表达式时,一旦启动它就无法在对象中访问它;这是为什么?
因为函数声明在当前范围内声明一个函数,就像var
声明一个变量一样。另请参阅Javascript: Do I need to put this.var for every variable in an object?了解变量和属性之间的区别。
如果构造函数没有看到前缀为'this','var'或'constructor.prototype'的函数,它会跳过它。
不。这不是“看到前缀”。 您正在编写代码,并且引擎不会知道正在执行的内容。函数表达式本身只是一个表达式,当你将它分配到某个地方时,它会收集一个含义。当您将其分配给当前实例(this
)的属性时,它将成为一种方法。使用函数声明也可以这样做:
function Constructor() {
// creating local identifiers:
var variable = function expression(){ };
function declaration() { };
// exporting properties:
this.method1 = variable;
this.method2 = declaration;
// or without the local variable:
this.method3 = function expression() { };
}