首页 / 知识
在Javascript中,为什么“this”运算符不一致?
2023-04-16 09:35:00

In Javascript, why is the “this” operator inconsistent?在JavaScript中,"this"运算符可以在不同的场景下引用不同的东西。 通常在JavaScript"对象"内的方法中,它引用当前对象。 但是当用作回调时,它将成为对调用对象的引用。 我发现这会导致代码出现问题,因为如果你在JavaScript"对象"中使用一个方法作为回调函数,你无法判断"this"是指当前的"对象"还是"this"是指 调用对象。 有人可以澄清如何解决这个问题的用法和最佳实践吗?
关于最佳实践的快速建议,然后我就这个变量的魔法喋喋不休。如果你想在Javascript中使用面向对象编程(OOP)来密切反映更传统/经典的继承模式,那么选择一个框架,学习它的怪癖,不要试图变得聪明。如果你想变得聪明,学习javascript作为一种功能语言,并避免考虑像类这样的事情。 这引出了关于Javascript的最重要的事情之一,并在没有意义时重复自己。 Javascript没有类。如果看起来像一个类,这是一个聪明的把戏。 Javascript有对象(不需要嘲弄引用)和函数。 (这不是100%准确,函数只是对象,但将它们视为单独的东西有时会有所帮助) 此变量附加到函数。无论何时调用函数,都会给出一定的值,具体取决于您调用函数的方式。这通常称为调用模式。 有四种方法可以在javascript中调用函数。您可以将函数作为方法,函数,构造函数和apply来调用。 作为一种方法 方法是附加到对象的函数
当作为方法调用时,它将绑定到函数/方法所属的对象。在这个例子中,这将绑定到foo。 作为一个功能 如果你有一个独立的函数,这个变量将被绑定到"全局"对象,几乎总是在浏览器的上下文中的窗口对象。
这可能是你绊倒的,但不要感觉不好。很多人认为这是一个糟糕的设计决定。由于回调是作为函数而不是作为方法调用的,因此您可以看到看似不一致的行为。 很多人通过这样做来解决这个问题
您定义一个指向此的变量。 Closure(一个它自己的主题)保持 作为构造函数
您还可以将函数作为构造函数调用。根据您正在使用的命名约定(
使用
当作为构造函数调用时,将创建一个新的Object,并将绑定到该对象。同样,如果你有内部函数并且它们被用作回调,你将把它们作为函数调用,并且它将被绑定到全局对象。使用 有些人认为构造函数/ new关键字是Java /传统OOP程序员抛出的骨骼,作为创建类似于类的东西的方法。 使用Apply方法。
最后,每个函数都有一个名为
在JavaScript中,
然后 要解决它,你需要使用闭包。您可以按如下方式更改代码:
但是,无论你想要什么,你都可以做到。所有函数都有.call()和.apply()方法,可用于使用自定义上下文调用它们。所以,如果我像这样建立一个智利对象:
...并调用Chile.stuff(),它会产生明显的结果:
但如果我想,我可以采取并真正搞砸它:
这实际上非常有用...... 如果您正在使用javascript框架,可能有一个方便的方法来处理这个问题。例如,在Prototype中,您可以调用方法并将其范围限定为特定的"this"对象:
注意:bind()返回一个函数,因此您也可以使用它来预先调整类中的回调:
http://www.prototypejs.org/api/function/bind 如果你正在使用Prototype,你可以使用bind()和bindAsEventListener()来解决这个问题。 你也可以使用Function.Apply(thisArg,argsArray)...其中thisArg确定函数内部的值...第二个参数是一个可选的arguments数组,你也可以传递给你的函数。 如果您不打算使用第二个参数,请不要传递任何内容。如果将null(或任何非数组)传递给function.apply()的第二个参数,Internet Explorer将抛出一个TypeError ... 使用示例代码,它看起来像:
一旦从其他上下文调用回调方法,我通常会使用我称之为回调上下文的东西:
我相信这可能是由于[闭包]的想法(http://en.wikipedia.org/wiki/Closure_(computer_science)如何在Javascript中工作。 我自己就是要掌握封口。阅读链接的维基百科文章。 这是另一篇有更多信息的文章。 那里的任何人都能证实这一点吗? |
最新内容
相关内容
linux命令引用文件名?
linux命令引用文件名?,工作,系统,信息,命令,数据,文件,时间,灵活,名称,标准,linux下按文件名和文件内容查找文件1、按名称查找文件你可以借助linux调用函数的命令?
linux调用函数的命令?,系统,代码,策略,上调,时间,设计,通信,网络,设备,项目,如何在Linux内核里增加一个系统调用?在一个进程中创建3个线程,名字linux外部命令调用?
linux外部命令调用?,系统,软件,标准,命令,盘中,管理,外部,进程,程序,内存,linux借用外部命令expr,实现计算器功能,利用管道,进程你得装一个callinux怎么调用命令行?
linux怎么调用命令行?,系统,地址,工具,工作,首页,终端,命令,密码,信息,情况,linux怎么打开命令行窗口1、在Linux系统中,打开命令行窗口需要使用浏览器调用linux命令?
浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,服务,求助大神,如何通过网页使用python向linux系统发送一些命令执py调用linux的命令?
py调用linux的命令?,系统,代码,状态,环境,标准,工具,命令,文件,脚本,终端,linux执行python脚本1、先将终端所在路径切换到python脚本文件的目浏览器调用linux命令?
浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,服务,求助大神,如何通过网页使用python向linux系统发送一些命令执py调用linux的命令?
py调用linux的命令?,系统,代码,状态,环境,标准,工具,命令,文件,脚本,终端,linux执行python脚本1、先将终端所在路径切换到python脚本文件的目linux系统命令调用?
linux系统命令调用?,系统,单位,工具,工作,管理,地址,权威,密码,电脑,信息,怎么把linux系统的命令行打开在Linux系统中,打开命令行窗口需要使用linux调用上一条命令?
linux调用上一条命令?,系统,命令,一致,数字,名称,网上,电脑,目录,空格,终端,linux返回上一级的命令是什么?怎么写?首先在电脑中,打开linux系统linux命令行调用程序?
linux命令行调用程序?,工具,环境,代码,初级,工程,系统,网上,服务,管理,发行,linux下如何运行程序?1、,首先去运行perl-v命令查看您的linux系统linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你