猿问

“this”关键字在函数中是如何工作的?

“this”关键字在函数中是如何工作的?

我刚刚在JavaScript中遇到了一个有趣的情况。我有一个类,它的方法是使用对象-文字表示法定义几个对象。在这些对象中,this指针正在使用。根据程序的行为,我推断this指针指的是调用方法的类,而不是文本创建的对象。

这似乎是武断的,虽然这是我希望它的工作方式。这是定义的行为吗?跨浏览器安全吗?是否有任何理由解释为什么它超出了“规范”的范围(例如,它是某个更广泛的设计决策/哲学的结果)?压缩代码示例:

// inside class definition, itself an object literal, we have this function:onRender: function() {

    this.menuItems = this.menuItems.concat([
        {
            text: 'Group by Module',
            rptletdiv: this
        },
        {
            text: 'Group by Status',
            rptletdiv: this
        }]);
    // etc}


慕勒3428872
浏览 501回答 3
3回答

神不在的星期二

从我的另一个岗位上吃人,这比你想知道的还要多这,这个.在我开始之前,最重要的是记住Javascript,并且在没有意义的时候重复一遍。JavaScript没有类(ES6)class是句法糖)。如果什么东西看起来像一个类,这是一个聪明的伎俩。JavaScript对象和功能..(这并不是100%的精确性,函数只是对象,但有时将它们看作单独的事物是有帮助的)这个这,这个变量被附加到函数中。每当你调用一个函数,这,这个的值,这取决于调用函数的方式。这通常被称为调用模式。在javascript中有四种调用函数的方法。您可以将该函数作为方法,作为功能,作为构造器,与应用.作为一种方法方法是附加在对象上的函数var foo = {};foo.someMethod = function(){     alert(this);}当作为方法调用时,这,这个将绑定到函数/方法所属的对象。在本例中,这将绑定到foo。作为A函数如果您有独立功能,则这,这个变量将绑定到“全局”对象,几乎总是窗户对象在浏览器的上下文中。 var foo = function(){     alert(this);  }  foo();这可能就是你被绊倒的原因但不要难过。许多人认为这是一个糟糕的设计决策。由于回调是作为函数调用的,而不是作为方法调用的,这就是为什么您将看到似乎不一致的行为。很多人通过做这样的事情来解决这个问题var foo = {};foo.someMethod = function (){     var that=this;     function bar(){         alert(that);     }}定义一个变量那,那个指向这,这个..关闭(一个主题本身的)保持那,那个因此,如果您调用BAR作为回调,它仍然有一个引用。注:在use strict模式如果用作函数,this不一定是全球性的。(是的)undefined).作为一个建设者还可以调用函数作为构造函数。基于您使用的命名约定(TestObject),这也是也许是你在做的事,也是你被绊倒的原因.使用新关键字作为构造器调用函数。function Foo(){     this.confusing = 'hell yeah';}var myObject = new Foo();当作为构造函数调用时,将创建一个新对象,并且这,这个会被绑在那个物体上。同样,如果您有内部函数并将它们用作回调,则将它们作为函数调用,并且这,这个将被绑定到全局对象。使用这个=这个技巧/模式的变量。有些人认为构造函数/新关键字是Java/传统OOP程序员创建类似类的一种方法。应用方法最后,每个函数都有一个名为“Apply”的方法(是的,函数是Javascript中的对象)。应用程序可以让您确定这,这个也允许您传递一个参数数组。这是一个无用的例子。function foo(a,b){     alert(a);     alert(b);     alert(this);}var args = ['ah','be'];foo.apply('omg',args);

MM们

这是定义的行为吗?跨浏览器安全吗?是。而且是的。有什么理由可以解释为什么它是这样的.意义this很容易推断出:如果this在构造函数中使用,并使用new关键词,this引用将要创建的对象。this即使在公开的方法中也会继续意味着目标。如果this在其他任何地方使用,包括嵌套的受保护函数,它引用全局范围(在浏览器中是窗口对象)。第二种情况显然是设计缺陷,但是通过使用闭包可以很容易地解决这个问题。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答