为什么嵌套函数不成为javascript中外部函数的属性?

时间:2019-12-07 05:41:32

标签: javascript javascript-objects prototypejs

我的代码如下:

function t() {
    var name = "abc";
    bar = function() {
    console.dir(this);
    console.log('bar');
 };
};
t.foo = function() {
    console.dir(this);
    this();
    console.log('bar');
};
console.dir(t);

输出如下:

ƒ t()
foo: ƒ ()
arguments: null
caller: null
length: 0
name: "t"
prototype: {constructor: ƒ}
__proto__: ƒ ()
[[FunctionLocation]]: VM2091:1
[[Scopes]]: Scopes[2]

因此我们可以看到,在检查函数t()时,我们找不到函数“ bar”,但是函数“ foo”在函数t()中。我的问题是,为什么函数“ bar”不存在函数t()的属性,而函数“ foo”变成函数t()的属性?

2 个答案:

答案 0 :(得分:0)

您正在使用类构造函数但未绑定它,所以在使用构造函数使用此关键字绑定变量时,这就是为什么bar不是t()的属性的原因。这样做

function t() {
var name = "abc";
this.bar = function() {
console.log(this);
console.log('bar');
   };
};

然后创建一个新对象     var newObj = new t(); 现在从newObj调用函数     newObj.bar(); 这应该工作

答案 1 :(得分:0)

您可以向任何JS对象添加属性,包括函数。因此,t.foo = ...正常工作并在您将t登录到控制台时显示为属性也就不足为奇了。值t.foo指向的事实纯粹是偶然的-它也可以是字符串,数字或其他任何东西。

bar这样的函数作用域变量与函数体中定义的任何其他变量相同;它不是函数的属性,在函数执行之前不存在。 bar声明了一个全局变量,因此它绑定到window.bar并在函数执行后继续存在。如果它是本地的,则在函数返回时将被销毁。

您可以使用foo.barfoo内部设置函数对象的属性,但是我无法想象这会有用很多。

function foo() {
  foo.baz = 42;
}

foo.bar = 43;
foo();
console.log(foo.bar, foo.baz);

在您的函数中,如果这些函数未绑定到任何对象,则this将为window。如果要将this绑定到新对象并使用函数构造函数设置属性,请使用new operator创建实例:

function Foo() {
  this.bar = 42;
  this.quux = function () {};
}

Foo.prototype.baz = 43;
Foo.prototype.corge = function () {};

console.log(new Foo());

这里的区别是,每当调用构造函数时,就会创建this.函数,而Foo.prototype.变量仅定义一次。