1、黑客劫持网络数据包 然后暴力解码(逆向工程)个人隐私数据被窃取
这里不作说明,感兴趣的自己了解
2、系统的内置功能的重写
例如:
<script>
var _log=console.log
console.log=function (str) {
_log(str)
//把hello发送给后台
_log("我执行了就代表发送给后台了")
}
console.log("hello")
//控制台打印了hello和我执行了就代表发送给后台了
</script>
3、this关键字的引用劫持
1、call()方法,相当于偷取别人的方法
例如:
<script>
var obj={name: "karen" ,say:function( ){console.log(this.name)}}
var obj2={name : "jack"}
obj.say.call(obj2)//相当于是obj2在调用say方法
//打印jack
</script>
2、apply()方法,与call()方法功能一样,只是填入的数据装在数组中。
代码展示两者差别:
<script>
var obj={name: "karen" ,say:function(str1,str2){console.log(this.name,str1,str2)}}
var obj2={name : "jack"}
obj.say.call(obj2,10,20)//"jack" 10 20
obj.say.apply(obj2,[10,20])//"jack" 10 20
//两个方法结果相同,可以清楚的看到apply传的实参是数组,但是实际打印的并不是,所以是在只是将每个数据放在数组内。
</script>
特殊点注意:运用窃取技术,数字也能获取到方法
<script>
var arr=[10,230,40,6,2]
var maxnum=Math.max.apply(0,arr)// 相当于假装0也有max方法
//0.max(10,230,40,6,2)==>230
console.log(maxnum)//230
</script>
3、bind()在函数定义时,事先就绑定其调用时候的调用者。
例如:
<script>
var obj2={name:"jack"}
var obj={
name:"karen",
say:function(){
console.log(this)
}.bind(obj2) //事先将这个方法指定为obj2调用
}
obj.say() //{name:"jack"}
var obj3={name:"marry"}
obj.say.call(obj3) //{name:"jack"}
obj.say.apply(obj3,[])//{name:"jack"}
</script>
总结
根据官方的源代码推出一些规律
1.所有的函数对象都有call方法---Function.prototype 有call方法
2.obj.say.call(obj2) 运行的函数是say函数(哪个函数调call方法就是哪个函数运行)
3.obj.say.call(obj2) 调用这个函数的对象是obj2(obj2调用say函数)
已知所有函数都有call方法,所以call函数也有call方法,进一步提升
<script>
function fn () {
console.log(1)
}
function fn2 () {
console.log(2)
}
fn.call.call(fn2) //打印2
/*
解析:
fn.call是一个函数它有call方法
fn.call引用了一个函数 这个函数运行
fn.call是一个函数这个函数是谁调用的? fn2
*/
</script>