- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
这个问题在这里已经有了答案:
How does the "this" keyword work?
(21 个回答)
6年前关闭。
我正在尝试了解 this
,这让我有点困惑:
var randomFunction = function(callback) {
var data = 10;
callback(data);
};
var obj = {
initialData: 20,
sumData: function(data) {
var sum = this.initialData + data;
console.log(sum);
},
prepareRandomFunction: function() {
randomFunction(this.sumData.bind(this));
}
};
obj.prepareRandomFunction();
是
this
旨在将自身设置在代码中首次呈现的位置?
obj
并将函数绑定(bind)到
obj
,但由于
this
正在作为回调函数传递,是什么阻止它被设置为
randomFunction
(即是什么阻止它从字面上传递“this.sumData.bind(this)”,以便
this
在从那里被调用时设置为
randomFunction
)?
this
在我将其定义为我的
randomFunction
的参数的地方被设置打电话,而不是在哪里
callback
在
randomFunction
内被调用.
this.sumData.bind(this)
与
callback(data)
我目前拥有的我认为我会得到不同的结果。是不是因为
callback
是对
this.sumData.bind(this)
的引用它是什么时候第一次定义的(在哪里
this
是
obj
)?
this
执行时设置。它不会作为参数传递,以便稍后在该参数被调用时进行设置。
最佳答案
this
在函数调用内部根据函数的调用方式设置。 this
主要有六种方式设置。
foo()
, this
设置为全局对象(浏览器中的 window
或 nodejs 中的 global
)或 undefined
(在 JavaScript 的严格模式下)。obj.foo()
其中方法foo
是使用 function
的普通方法声明关键字或对 class
使用常规方法声明语法,然后 this
设置为 obj
函数内部。.apply()
或 .call()
被使用,然后 this
根据传递给 .apply()
的内容设置或 .call()
.例如,你可以做 foo.call(myObj)
并导致 this
设置为 myObj
内部 foo()
对于那个特定的函数调用。new
调用函数如 new foo()
,然后创建一个新对象和构造函数 foo
用 this
调用设置为新创建的对象。.bind()
从内部使用 .apply()
的调用返回一个新的 stub 函数设置 this
传递给 .bind()
的指针.仅供引用,这并不是真正的不同情况,因为 .bind()
可以通过 .apply()
实现.this
到它。因此,无论在其他地方如何调用该函数(使用之前的任何调用方式),this
value 将由解释器设置为值 this
在定义函数时有。这与所有其他函数调用完全不同。this
的值。将在调用回调时。您必须查阅文档或调用函数的代码或自行测试以确定是什么
this
将在回调中设置为。
this
设置一个新值。 .并且,设置哪个值取决于函数的调用方式。
obj.method()
因此不会有
this
的正确值设置它。您可以使用
.bind()
解决这个问题。
this
调用也很有用。由调用回调函数的基础设施设置。在内部,他们都使用
.call()
或
.apply()
所以这不是一个新规则,而是需要注意的事情。回调函数的“契约”可能包括它如何设置
this
的值。 .如果没有明确设置
this
的值,那么它将根据规则 #1 进行设置。
this
.这是维护词法
this
的数组函数的示例
from MDN :
function Person(){
this.age = 0;
setInterval(() => {
this.age++; // |this| properly refers to the person object
}, 1000);
}
var p = new Person();
obj.prepareRandomFunction();
示例是上面的规则 #2 所以
this
将设置为
obj
.
randomFunction(this.sumData.bind(this))
示例是上面的规则 #1 所以
this
内部
randomFunction
将设置为全局对象或
undefined
(如果在严格模式下)。
.bind()
,那么
this
的值回调函数内部调用时会被设置为
this
的值传递给
.bind()
在
this.sumData.bind(this)
就像上面的第 5 条规则一样。
.bind()
实际上创建了一个新函数,它的工作是在设置自定义值
this
之后调用原始函数。 .
.apply()
或
.call()
或
.bind()
,您可以创建各种有点奇怪的东西,有时甚至是非常有用的东西,而这些东西在
C++ 之类的东西中是永远无法完成的。 .您可以使用世界上的任何函数或方法,并像调用其他对象的方法一样调用它。
arguments
中的项目。对象到数组中:
var args = Array.prototype.slice.call(arguments, 0);
或类似:
var args = [].slice.call(arguments, 0);
这需要数组的
.slice()
方法并调用它,但为它提供了一个参数对象作为
this
指针。
arguments
对象(虽然不是实际的数组),具有足够的类似数组的功能,
.slice()
方法可以对其进行操作,它最终会复制
arguments
items 到一个实际数组中,然后可以直接使用实际数组操作对其进行操作。这种诡计不能随意完成。如果数组
.slice()
方法依赖于
arguments
上不存在的其他数组方法对象,那么这个技巧是行不通的,但因为它只依赖于
[]
和
.length
,其中
arguments
对象有,它确实有效。
关于javascript - 当您将 'this' 作为参数传递时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28016664/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!