
例如这样的 一个 闭包作用于
$(function(){ var v1 = "想要修改(访问)这个" function pv1(){ console.log(v1) } }) // 有没有什么奇怪的方法在这个作用域拿到 $(function(){} 里的属性? [v1] = "修改的值" [pv1](); // 打印出'修改的值' 就对了 Javascript 能做到这一点吗?
1 bdbai 2016-12-04 17:31:28 +08:00 via Android 闭包里面的变量外面不能访问。你可以让闭包返回一个函数,调用函数修改 v1 的值。 |
2 maomaomao001 OP |
3 bdbai 2016-12-04 17:43:28 +08:00 via Android @maomaomao001 让闭包返回一个函数,外面调用函数修改 v1 的值。 |
4 tux 2016-12-04 17:46:08 +08:00 刚好碰到同样问题,也没找到办法 但是有一个说法是在 JS 文件加载之前阻止,然后替换成一个修改过的 也就是 JS 劫持 |
5 luoway 2016-12-04 22:38:26 +08:00 1L 正解 |
6 sensui7 2016-12-04 23:20:13 +08:00 via iPhone 所以你其实是想修改一个局部变量。 如果是简单数据类型,修改没意义吧,值引用的。如果是对象,确实可以通过闭包修改。然而正确的做法不是在对象里做接口吗。 结论是你的想法就很独特 |
7 maomaomao001 OP @sensui7 主要是想,从外部入侵别人的代码~~~实现修改~~~似乎除了拦截 js 并修改,别无它法~~ |
8 lalalanet 2016-12-05 07:44:34 +08:00 via iPhone 在老版本浏览器里,你可以把 console.log 重写 |
9 itkdqwzero 2016-12-05 08:27:26 +08:00 via Android 用 getter 与 setter |
10 ianva 2016-12-05 10:52:06 +08:00 如果是特殊原因的话,用 hack 点的方法,将这段代码 toString 后在代码里插入相应的 get 方法,然后 eval 就可以跑了 |
11 ianva 2016-12-05 10:59:51 +08:00 当然如果不好 toString 的话可以直接拿 script 标签里的文本 如果是写在 script 标签内的可以通过 innerHTML 拿 如果是 js 文件可以用 $.get("hello.js",function(text){alert(text)}) 的方式拿到 后面做匹配插入文本和 eval 就很简单了 |
12 zhuangzhuang1988 2016-12-05 13:05:20 +08:00 |
13 maomaomao001 OP @ianva 这样是可以跑~~~到是源代码里的环境并没有变啊~~比源代码设置了一个定时器~~~定时比对某个变量~~~ 你 eval 运行后只能是一个新的环境,新的定时器,原先的还在继续执行着 |
14 ianva 2016-12-05 13:30:55 +08:00 不让他运行的方法太多了,举个例子,比如这个函数,是基于 domready 执行的晚的很,依赖于 jquery ,你在这个代码之前将 var $ = function(){} 就解决问题了,需要的时候引入 jquery ,这是一种方案,思路是不运行咯,当然有各种手段 |