if (!Function.prototype.bind) { Function.prototype.bind = function(oThis) { if (typeof this !== 'function') { // closest thing possible to the ECMAScript 5 // internal IsCallable function throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); } var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function() {}, fBound = function() { // this instanceof fNOP === true时,说明返回的fBound被当做new的构造函数调用 return fToBind.apply(this instanceof fNOP ? this : oThis, // 获取调用时(fBound)的传参.bind 返回的函数入参往往是这么传递的 aArgs.concat(Array.prototype.slice.call(arguments))); }; // 维护原型关系 if (this.prototype) { // Function.prototype doesn't have a prototype property fNOP.prototype = this.prototype; } // 下行的代码使fBound.prototype是fNOP的实例,因此 // 返回的fBound若作为new的构造函数,new生成的新对象作为this传入fBound,新对象的__proto__就是fNOP的实例 fBound.prototype = new fNOP(); return fBound; }; }
参考https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
1. bind和call、apply一样会改变this的指向,但是bind返回的是一个函数,函数内部调用的apply方法。
var o = {name:'wenwen'}; var obj = { name: 'li', say: function(){ console.log(this.name); } }; var say = obj.say.bind(o); say(); //wenwen obj.say.call(o); //wenwen
2. bind函数还保存了bind的调用方,可以使用new来初始化调用方。还可以实现属性和方法的继承,因为bind函数的特殊性,属性没办法再添加了,但是可以添加原型方法,不影响父类的原型。不过一般也不会这么用,主要用的还是上面的用法
function foo(){ this.b = 100; this.fun = function(){} return this.a; } foo.prototype.nfn = function(){} var func = foo.bind({});//这里要传入一个obj,不能为空,为空的话this会变成window,还可以实现继承,属性和原型都可以继承 foo.prototype.test = function(){} func.prototype.name = 'wenwen1'; func.prototype.b = 300; console.log(new func); console.log(new foo); func();
jsonp原理
其实就是封装了一个script标签,请求一个地址,支持callback函数,后台会返回一个执行的方法,从而实现回调和数据传输。
<script type="text/javascript"> $(document).ready(function(){ var url = "http://www.practice-zhao.com/student.php?id=1&callback=jsonhandle"; var obj = $('<script></script>'); obj.attr("src",url); $("body").append(obj); }); </script> <?php $data = array( 'age' => 20, 'name' => '张三', ); $callback = $_GET['callback']; echo $callback."(".json_encode($data).")"; return;