ในอดีตคุณอาจตั้งค่า self = สิ่งนี้หรือสิ่งนี้ = สิ่งนี้ ฯลฯ ซึ่งแน่นอนว่าจะใช้งานได้ แต่การใช้ function.prototype.bind () จะดีกว่าและจะดูเป็นมืออาชีพมากขึ้น
นี่คือตัวอย่างง่ายๆ:
การคัดลอกรหัสมีดังนี้:
var myobj = {
SpecialFunction: function () {
-
anotherspecialfunction: function () {
-
getAsyncData: ฟังก์ชั่น (cb) {
CB ();
-
render: function () {
var that = this;
this.getasyncData (function () {
นั่น specialfunction ();
นั่นคือ AnothersPecialFunction ();
-
-
-
myobj.render ();
ในตัวอย่างนี้เพื่อรักษาบริบท myObj ตัวแปรที่ = นี่คือการตั้งค่าซึ่งใช้งานได้ แต่มันไม่ได้ดูเป็นระเบียบโดยไม่ต้องใช้ function.prototype.bind ():
การคัดลอกรหัสมีดังนี้:
render: function () {
this.getasyncData (function () {
this.specialfunction ();
this.anotherpecialfunction ();
}. -bind (นี่));
-
เมื่อโทร. bind () มันจะสร้างฟังก์ชั่นใหม่และส่งผ่านไปยังฟังก์ชั่นนี้ รหัสที่ใช้. bind () เป็นแบบนี้:
คัดลอกรหัสดังนี้: function.prototype.bind = ฟังก์ชั่น (ขอบเขต) {
var fn = สิ่งนี้;
return function () {
ส่งคืน fn.apply (ขอบเขต);
-
-
นี่คือตัวอย่างง่ายๆของการใช้ function.prototype.bind ():
การคัดลอกรหัสมีดังนี้:
var foo = {
x: 3
-
var bar = function () {
console.log (this.x);
-
บาร์ ();
var boundfunc = bar.bind (foo);
Boundfunc ();
มันไม่มีประโยชน์มากเหรอ? น่าเสียดายที่เบราว์เซอร์ด้านล่าง IE8 และด้านล่างไม่สนับสนุนฟังก์ชั่น prototype.bind () เบราว์เซอร์ที่รองรับ ได้แก่ Chrome 7+, Firefox 4.0+, IE 9+, Opera 11.60+, Safari 5.1.4+ แม้ว่า IE 8/7/6 และเบราว์เซอร์อื่น ๆ ไม่รองรับ แต่กลุ่มพัฒนา Mozilla เขียนฟังก์ชั่นที่มีฟังก์ชั่นที่คล้ายกันสำหรับเบราว์เซอร์ IE รุ่นเก่าโดยมีรหัสดังนี้:
การคัดลอกรหัสมีดังนี้:
if (! function.prototype.bind) {
function.prototype.bind = ฟังก์ชั่น (othis) {
if (typeof this! == "function") {
// สิ่งที่ใกล้เคียงที่สุดเท่าที่จะเป็นไปได้สำหรับฟังก์ชัน eCmascript 5 ภายใน iscallable
โยน typeerror ใหม่ ("function.prototype.bind - สิ่งที่พยายามจะถูกผูกไว้คือไม่เรียกได้");
-
var aargs = array.prototype.slice.call (อาร์กิวเมนต์, 1),
ftobind = สิ่งนี้
fnop = function () {}
fbound = function () {
ส่งคืน ftobind.apply (อินสแตนซ์นี้ของ fnop && othis
? นี้
: โอทิส
aargs.concat (array.prototype.slice.call (อาร์กิวเมนต์)));
-
fnop.prototype = this.prototype;
fbound.prototype = new fnop ();
กลับ fbound;
-
-