与JavaScript作用域链进行交互
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了与JavaScript作用域链进行交互,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1885字,纯文字阅读大概需要3分钟。
内容图文
![与JavaScript作用域链进行交互](/upload/InfoBanner/zyjiaocheng/671/50c13b6898f24731b4b6eb9da8271f84.jpg)
给定范围内的以下javascript代码段:
var x = 10;
function sayx() {
alert(x);
}
sayx();
您当然希望出现一个显示“ 10”的消息框,您可以执行多个函数嵌套以与如何确定“ x”进行交互,因为在解析x时,环境会沿作用域链上移.
您甚至可以使用eval进行“重新编译”,以在运行时注入新作用域.例如:
var x = 10;
function sayx() {
alert(x);
}
function wrap(f) {
return eval('(function() { var x = 20;(' + f + ')(); })');
}
wrap(sayx)();
之所以可行,是因为该函数将调用其toString函数,该函数将返回“原始”源..因此,我们实质上创建了该函数的包装版本,该包装版本具有覆盖x的新作用域.结果将是一个打印警告框“ 20”而不是“ 10”.
但是,从表面上看,这似乎可行,但作用域链已损坏,该链中的下一项不再相同,因为函数“ f”现在在不同的位置定义.更糟糕的是作用域链它已继承,可能包含调用函数不应该访问的许多引用.
因此,是否存在注入范围项的更受支持的可行方法?就像是:
function withScope(f, scope) { ??? }
---
var x = 10, y = 10;
function dothemath() {
alert(x + y);
}
var haxthemath = withScope(dothemath, { x: 9000 });
haxthemath(); // 9010 not 20
我猜答案是“否”,有人可能会争辩说这种范围注入存在“安全性”问题,但是考虑到您仍然可以做到这一点(尽管严重损坏了),我认为不是.
这样的好处是,您基本上可以伪造自己的伪变量.
提前致谢.
编辑一下,想像一下,想象一下我想“ withScope”一个具有以下作用域链的函数:
Window - window properties
Object - { var x = 10 }
Object - { var y = 5 + x }
我希望能够找回一个具有与我提供的作用域相同的链的函数.即:
withScope(somefunc, { foo: 'bar' })
会给我
Window - window properties
Object - { var x = 10 }
Object - { var y = 5 + x }
Ext scope - { foo = 'bar' }
可以找到所有先前的常规变量,因为我的扩展范围未说明任何内容.
解决方法:
如果按作用域引用函数和/或闭包中的局部变量,我认为答案是否定的.
您可以使用functionName.call(scope,arg1,…)或functionName.apply(scope,[arg1,…]);来更改this关键字的范围.它可以与原型一起使用,以创建您所描述的相似链-如果在对象自身的属性中找不到某些内容,则会在其原型中进行查找.如果该属性不存在,则使用链中的下一个原型,依此类推.
内容总结
以上是互联网集市为您收集整理的与JavaScript作用域链进行交互全部内容,希望文章能够帮你解决与JavaScript作用域链进行交互所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。