为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕勒3428872 2019-06-03 16:19:28
“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}
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

从我的另一个岗位上吃人,这比你想知道的还要多这,这个.

在我开始之前,最重要的是记住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);


查看完整回答
反对 回复 2019-06-03
?
MM们

TA贡献1886条经验 获得超2个赞

这是定义的行为吗?跨浏览器安全吗?

是。而且是的。

有什么理由可以解释为什么它是这样的.

意义this很容易推断出:

  1. 如果

    this

    在构造函数中使用,并使用

    new

    关键词,

    this

    引用将要创建的对象。

    this

    即使在公开的方法中也会继续意味着目标。
  2. 如果

    this

    在其他任何地方使用,包括嵌套的

    受保护

    函数,它引用全局范围(在浏览器中是窗口对象)。

第二种情况显然是设计缺陷,但是通过使用闭包可以很容易地解决这个问题。


查看完整回答
反对 回复 2019-06-03
  • 3 回答
  • 0 关注
  • 500 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信