javascript 有没有办法从外部访问(修改) 闭包里的 属性

2016-12-04 17:04:12 +08:00
 maomaomao001

例如这样的 一个 闭包作用于

$(function(){
	var v1 = "想要修改(访问)这个"
	
	function pv1(){
		console.log(v1)
	}
	
})

// 有没有什么奇怪的方法在这个作用域拿到 $(function(){} 里的属性?

[v1] = "修改的值"

[pv1](); // 打印出'修改的值' 就对了

javascript 能做到这一点吗?

5187 次点击
所在节点    JavaScript
14 条回复
bdbai
2016-12-04 17:31:28 +08:00
闭包里面的变量外面不能访问。你可以让闭包返回一个函数,调用函数修改 v1 的值。
maomaomao001
2016-12-04 17:35:48 +08:00
@bdbai 嗯,我知道按常理是不能访问的,所以就想问问 有没有比较奇特的方法

PS: 你用谷歌浏览器断点调试的时候 就可以修改闭包里面的变量
bdbai
2016-12-04 17:43:28 +08:00
@maomaomao001 让闭包返回一个函数,外面调用函数修改 v1 的值。
tux
2016-12-04 17:46:08 +08:00
刚好碰到同样问题,也没找到办法
但是有一个说法是在 JS 文件加载之前阻止,然后替换成一个修改过的
也就是 JS 劫持
luoway
2016-12-04 22:38:26 +08:00
1L 正解
sensui7
2016-12-04 23:20:13 +08:00
所以你其实是想修改一个局部变量。

如果是简单数据类型,修改没意义吧,值引用的。如果是对象,确实可以通过闭包修改。然而正确的做法不是在对象里做接口吗。
结论是你的想法就很独特
maomaomao001
2016-12-05 00:43:53 +08:00
@sensui7 主要是想,从外部入侵别人的代码~~~实现修改~~~似乎除了拦截 js 并修改,别无它法~~
lalalanet
2016-12-05 07:44:34 +08:00
在老版本浏览器里,你可以把 console.log 重写
itkdqwzero
2016-12-05 08:27:26 +08:00
用 getter 与 setter
ianva
2016-12-05 10:52:06 +08:00
如果是特殊原因的话,用 hack 点的方法,将这段代码 toString 后在代码里插入相应的 get 方法,然后 eval 就可以跑了
ianva
2016-12-05 10:59:51 +08:00
当然如果不好 toString 的话可以直接拿 script 标签里的文本
如果是写在 script 标签内的可以通过 innerHTML 拿
如果是 js 文件可以用 $.get("hello.js",function(text){alert(text)}) 的方式拿到
后面做匹配插入文本和 eval 就很简单了
zhuangzhuang1988
2016-12-05 13:05:20 +08:00
maomaomao001
2016-12-05 13:14:19 +08:00
@ianva 这样是可以跑~~~到是源代码里的环境并没有变啊~~比源代码设置了一个定时器~~~定时比对某个变量~~~
你 eval 运行后只能是一个新的环境,新的定时器,原先的还在继续执行着
ianva
2016-12-05 13:30:55 +08:00
不让他运行的方法太多了,举个例子,比如这个函数,是基于 domready 执行的晚的很,依赖于 jquery ,你在这个代码之前将 var $ = function(){} 就解决问题了,需要的时候引入 jquery ,这是一种方案,思路是不运行咯,当然有各种手段

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/325205

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX