- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(问题 1)在 Flanagan 的 JS 权威指南中,他定义了 Function
方法 bind()
以防它不可用(在 ECMAScript 3 中不可用)。
看起来像这样:
function bind(f, o) {
if (f.bind) return f.bind(o); // Use the bind method, if there is one
else return function() { // Otherwise, bind it like this
return f.apply(o, arguments);
};
}
他用一个例子说明了它的用法(我修改了它以更改 f.bind(o)
的第 3 行):
function f(y) { return this.x + y; } // This function needs to be bound
var o = { x : 1 }; // An object we'll bind to
var g = bind(f, o); // Calling g(x) invokes o.f(x)
g(2) // => 3
当我第一次看到这个时,我想“arguments
不会引用我们正在定义的绑定(bind)函数中的参数变量吗?但是我们想要最终应用它的函数的参数属性就像上面例子中的 g...”
我验证了他的示例确实有效,并推测 return f.apply(o, arguments)
行直到 var g = bind(f, o)< 才被评估
上面。也就是说,我想,当你返回一个函数时,你只是返回那个函数的源代码,不是吗?直到它被评估?所以我通过尝试一个稍微不同的绑定(bind)版本来测试这个理论:
function mybind2(f, o) {
var arguments = 6;
return function() { // Otherwise, bind it like this
return f.apply(o, arguments);
};
}
如果它只是简单地返回未计算的函数源,那么在以后计算时它不可能存储 arguments = 6
,对吗?在检查之后,我仍然得到 g(2)
=> 3。但后来我意识到——如果它只是返回未评估的代码, 中的
通过了吗?o
怎么样? return f.apply(o, arguments)
所以我决定一定要发生的事情是这样的:
o
和 arguments
变量(即使 arguments
等于 6) 正在传递给功能。只是当函数 g
最终被调用时,arguments
变量被解释器重新定义为 g
的参数(在 g(2)
),因此我尝试传递的参数的原始值被替换了。但这意味着直到那时它都是将函数存储为文本,因为否则 o
和 arguments
将只是程序中的数据,而不是可能的变量被覆盖。这个解释对吗?
(问题 2) 在同一页的前面,他定义了以下函数,该函数使用 apply
方法来跟踪函数以进行调试:
function trace(o, m) {
var original = o[m]; // Remember original method in the closure.
o[m] = function() { // Now define the new method.
console.log(new Date(), "Entering:", m); // Log message.
var result = original.apply(this, arguments); // Invoke original.
console.log(new Date(), "Exiting:", m); // Log message.
return result; // Return result.
};
}
这里的 this
不是指我们定义的函数,而不是对象 o
吗?或者这两者是一回事?
最佳答案
对于您的第一个问题,让我们简化示例,以便清楚要做什么:
function bind(func, thisArg) {
return function () {
return func.apply(thisArg, arguments);
};
}
这里发生的是创建一个闭包,允许访问原始函数和传递的 this
的值。返回的匿名函数会将原始函数保留在其范围内,最终如下所示:
var func = function () {};
var thisArg = {};
func.apply(thisArg, [/*arguments*/]);
关于您的arguments
问题,该变量隐式定义在创建的所有函数的范围内,因此内部arguments
将隐藏外部参数
,使其按预期工作。
你的问题是你对 this
的后期绑定(bind)的误解——对于习惯于更多面向对象语言的人来说,这是 JavaScript 中最令人困惑的事情之一,这些语言也有自己的 this
关键字。 this
的值只在调用时设置,调用的地方定义了调用时this
的值。它只是调用函数时父对象的值,this
值被覆盖的情况除外。
例如,看这个:
function a() {return this;};
a(); // global object;
var b = {};
b.a = a;
b.a(); // object b
如果在定义函数时设置了 this
,则调用 b.a
将生成全局对象,而不是 b
对象。让我们也简化给出的第二个函数所发生的事情:
function trace(obj, property) {
var method = obj[property]; // Remember original method in the closure.
obj[property] = function () { // Now define the new method.
console.log(1); // Log message.
// Invoke original method and return its result
return original.apply(this, arguments);
};
}
在这种情况下发生的是原始方法存储在闭包中。分配给方法最初所在的对象不会覆盖 method
对象。就像普通的方法赋值一样,this
值的原理仍然相同——它将返回父对象,而不是您定义的函数。如果你做一个简单的任务:
var obj = {};
obj.foo = function () { return this; };
obj.foo(); // obj
它做了预期的事情,返回调用时的父对象。在这方面,将您的代码放在嵌套函数中没有任何区别。
如果您想了解更多有关使用 JavaScript 编写代码的信息,我强烈建议您查看 Fully Understanding the this
Keyword作者:Cody Lindley —— 它更详细地介绍了 this
关键字在不同上下文中的行为方式以及您可以使用它做的事情。
关于javascript - 验证我对作用域链的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20461963/
在 JSF2 应用程序中遇到验证属性的问题时,有两种主要方法。 使用 Annotation 在 ManagedBean 上定义验证 @ManagedBean public class MyBean {
我想实现一个不常见的功能,我认为 jquery 验证插件将是最好的方法(如果您在没有插件的情况下建议和回答,我们也会欢迎)。我想在用户在输入字段中输入正确的单词后立即隐藏表单。我试过这个: $("
我有几个下拉菜单(类名为month_dropdown),并且下拉菜单的数量不是恒定的。我怎样才能为它们实现 NotEqual 验证。我正在使用 jQuery 验证插件。 这就是我写的 - jQuery
我设法制作了这个网址验证代码并且它起作用了。但我面临着一个问题。我认为 stackoverflow 是获得解决方案的最佳场所。 function url_followers(){ var url=do
我目前正在使用后端服务,该服务允许用户在客户端应用程序上使用 Google Games 库登录。 用户可以通过他们的 gplay ID 向我们发送信息,以便登录或恢复旧帐户。用户向我们发送以下内容,包
我正在尝试验证输入以查看它是否是有效的 IP 地址(可能是部分地址)。 可接受的输入:172、172.112、172.112.113、172.112.113.114 Not Acceptable 输入
我从 Mongoose 验证中得到这条消息: 'Validator failed for path phone with value ``' 这不应该发生,因为不需要电话。 这是我的模型架构: var
我一直在尝试使用Python-LDAP (版本 2.4.19)在 MacOS X 10.9.5 和 Python 2.7.9 下 我想在调用 .start_tls_s() 后验证与给定 LDAP 服务
我正在处理一个仅与 IE6 兼容的旧 javascript 项目(抱歉...),我想仅在 VS 2017 中禁用此项目的 ESLint/CSLint/Javascript 验证/CSS 验证。 我知道
我正在寻找一种方法来验证 Spring 命令 bean 中的 java.lang.Double 字段的最大值和最小值(一个值必须位于给定的值范围之间),例如, public final class W
我正在尝试在 springfuse(JavaEE 6 + Spring Framework (针对 Jetty、Tomcat、JBoss 等)) 和 maven 的帮助下构建我的 webapps 工作
我试图在我们的项目中使用 scalaz 验证,但遇到了以下情况: def rate(username: String, params: Map[String, String]): Validation
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
我有一个表单,人们可以单击并向表单添加字段,并且我需要让它在单击时验证这些字段中的值。 假设我单击它两次并获取 2 个独立的字段集,我需要旋转 % 以确保它在保存时等于 100。 我已放入此函数以使其
在我的页面中有一个选项可以创建新的日期字段输入框。用户可以根据需要创建尽可能多的“截止日期”和“起始日期”框。就像, 日期_to1 || date_from1 日期到2 ||日期_from2 date
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
有没有办法在动态字段上使用 jquery 验证表单。 我想将其设置为必填字段 我正在使用 Jsp 动态创建表单字段。 喜欢 等等...... 我想使用必需的表单字段验证此表单字段。 最佳答
嗨,任何人都可以通过提供 JavaScript 代码来帮助我验证用户名文本框不应包含数字,它只能包含一个字符。 最佳答案 使用正则表达式: (\d)+ 如果找到匹配项,则字符串中就有一个数字。 关于J
我有两个输入字段holidayDate和Description(id=tags) $(document).ready(function() {
我遇到了这个问题,这些验证从电子邮件验证部分开始就停止工作。 我只是不明白为什么即使经过几天的观察,只是想知道是否有人可以在这里指出我的错误? Javascript部分: function valid
我是一名优秀的程序员,十分优秀!