Chắc chắn tránh sử dụng eval để làm một cái gì đó như thế này, hoặc bạn sẽ mở ra các lỗ hổng XSS (kịch bản chéo trang).
Ví dụ: nếu bạn sử dụng các giải pháp eval được đề xuất ở đây, một người dùng bất chính có thể gửi một liên kết đến nạn nhân của họ trông như thế này:
//yoursite.com/foo.html?func=function(){alert('Im%20In%20Teh%20Codez');}
Và JavaScript của họ, không phải của bạn, sẽ được thực thi. Mã này có thể làm một cái gì đó tồi tệ hơn nhiều so với chỉ bật lên một cảnh báo; Nó có thể ăn cắp cookie, gửi yêu cầu đến ứng dụng của bạn, v.v.
Vì vậy, hãy chắc chắn rằng bạn không bao giờ eval mã không đáng tin cậy xuất phát từ đầu vào của người dùng (và bất cứ điều gì trên ID chuỗi truy vấn được coi là đầu vào của người dùng). Bạn có thể lấy đầu vào của người dùng làm khóa sẽ trỏ đến chức năng của mình, nhưng đảm bảo rằng bạn không thực thi bất cứ điều gì nếu chuỗi đưa ra không khớp với một khóa trong đối tượng của bạn. Ví dụ:
// set up the possible functions: var myFuncs = { func1: function () { alert('Function 1'); }, func2: function () { alert('Function 2'); }, func3: function () { alert('Function 3'); }, func4: function () { alert('Function 4'); }, func5: function () { alert('Function 5'); } }; // execute the one specified in the 'funcToRun' variable: myFuncs[funcToRun]();Điều này sẽ thất bại nếu biến funcToRun không trỏ đến bất cứ điều gì trong đối tượng myFuncs, nhưng nó sẽ không thực thi bất kỳ mã nào.
Bạn có thể sử dụng phương thức eval() để gọi hàm JavaScript có tên được lưu trữ trong một biến chuỗi nhưng có một phương pháp tốt hơn mà không yêu cầu Eval.
Hãy nói rằng chúng tôi có một chức năng Helloworld (E) có thể thay đổi và in nó.
function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }
Chúng tôi tuyên bố một biến có tên hàm và một biến khác lưu trữ các đối số.
// Function name to invoke var fnName = 'helloWorld'; // Params to pass to the function var params = 'ctrlq.org'; // Call function using Window object window[fnName](params);
Điều này cũng có thể hữu ích để gọi các chức năng tập lệnh của Google Apps. Tuy nhiên, vì nó là mã phía máy chủ chứ không phải môi trường trình duyệt web, chúng tôi sử dụng điều này để chỉ đối tượng có chứa nó.
Phương pháp tái sử dụng
Với phương thức call(), bạn có thể viết một phương thức có thể được sử dụng trên các đối tượng khác nhau.
Tất cả các chức năng là phương pháp
Trong JavaScript, tất cả các chức năng là các phương thức đối tượng.
Nếu một hàm không phải là phương thức của đối tượng JavaScript, thì đó là một hàm của đối tượng toàn cầu (xem chương trước).
Ví dụ dưới đây tạo ra một đối tượng với 3 thuộc tính, tên FirstName, lastName, fullName.
Thí dụ
const person = {& nbsp; & nbsp; firstName: "john", & nbsp; & nbsp; lastName: "doe", & nbsp; fullName: function () {& nbsp; & nbsp; & nbsp; Trả về this.FirstName + "" + this.lastName; & nbsp; & nbsp;}}
firstName:"John",
lastName: "Doe",
fullName: function () {
return this.firstName + " " + this.lastName;
}
}
// Điều này sẽ trả lại "John Doe": person.fullname ();
person.fullName();
Hãy tự mình thử »
Trong ví dụ trên, function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 đề cập đến đối tượng người.person object.
this.firstName có nghĩa là thuộc tính đầu tiên của điều này. means the firstName property of this.
Giống như:
this.firstName có nghĩa là thuộc tính đầu tiên của người. means the firstName property of person.
Cái này là cái gì?this?
Trong JavaScript, từ khóa function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 đề cập đến một đối tượng.object.
Đối tượng nào phụ thuộc vào cách function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 được gọi (được sử dụng hoặc gọi). object depends on how function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 is being invoked (used or called).
Từ khóa function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 đề cập đến các đối tượng khác nhau tùy thuộc vào cách sử dụng:
Trong một phương thức đối tượng, function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 đề cập đến đối tượng.object. |
Một mình, function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 đề cập đến đối tượng toàn cầu.global object. |
Trong một chức năng, function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 đề cập đến đối tượng toàn cầu.global object. |
Trong một hàm, ở chế độ nghiêm ngặt, function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 là function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }8. |
Trong một sự kiện, function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 đề cập đến yếu tố đã nhận được sự kiện.element that received the event. |
Các phương thức như call(), // Function name to invoke var fnName = 'helloWorld'; // Params to pass to the function var params = 'ctrlq.org'; // Call function using Window object window[fnName](params);1 và // Function name to invoke var fnName = 'helloWorld'; // Params to pass to the function var params = 'ctrlq.org'; // Call function using Window object window[fnName](params);2 có thể giới thiệu function helloWorld(e) { e = e || 'Anonymous'; console.log('Hello ' + e); return; }0 cho bất kỳ đối tượng nào.any object. |
Phương thức call () call call ()
Phương pháp call() là phương pháp JavaScript được xác định trước.
Nó có thể được sử dụng để gọi (gọi) một phương thức với một đối tượng chủ sở hữu làm đối số (tham số).
Với call(), một đối tượng có thể sử dụng một phương thức thuộc về một đối tượng khác.
Ví dụ này gọi phương thức FullName của người, sử dụng nó trên Person1:fullName method of person, using it on person1:
Thí dụ
const person = {& nbsp; & nbsp; fullName: function () {& nbsp; & nbsp; & nbsp; & nbsp; return this.firstName + "" + this.lastName; & nbsp; & nbsp;}} const person1 = {& nbsp; & nbsp; firstName: "john", & nbsp; Tên cuối cùng: "doe"} const person2 = {& nbsp; tên đầu tiên: "Mary", & nbsp; Tên cuối cùng: "doe"}
fullName:
function() {
return this.firstName + " " + this.lastName;
}
}
const person1 = {
firstName:"John",
lastName: "Doe"
}
const person2 = {
firstName:"Mary",
lastName: "Doe"
}
// Điều này sẽ trả lại "John Doe": person.fullname.call (person1);
person.fullName.call(person1);
Hãy tự mình thử »
Ví dụ này gọi phương thức FullName của người, sử dụng nó trên Person2:fullName method of person, using it on person2:
Thí dụ
const person = {& nbsp; fullName: function () {& nbsp; & nbsp; & nbsp; Trả về this.FirstName + "" + this.lastName; & nbsp; & nbsp;}} const person1 = {& nbsp; & nbsp; firstName: "john", & nbsp; Tên cuối cùng: "doe"} const person2 = {& nbsp; tên đầu tiên: "Mary", & nbsp; Tên cuối cùng: "doe"}
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
const person1 = {
firstName:"John",
lastName: "Doe"
}
const person2 = {
firstName:"Mary",
lastName: "Doe"
}
// Điều này sẽ trả lại "Mary Doe" person.fullname.call (person2);
person.fullName.call(person2);
Hãy tự mình thử »
Ví dụ này gọi phương thức FullName của người, sử dụng nó trên Person2:
const person = {& nbsp; fullName: function () {& nbsp; & nbsp; & nbsp; Trả về this.FirstName + "" + this.lastName; & nbsp; & nbsp;}} const person1 = {& nbsp; & nbsp; firstName: "john", & nbsp; Tên cuối cùng: "doe"} const person2 = {& nbsp; tên đầu tiên: "Mary", & nbsp; Tên cuối cùng: "doe"}
Thí dụ
// Điều này sẽ trả lại "Mary Doe" person.fullname.call (person2);
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," +
country;
}
}
Phương thức gọi () với các đối số
firstName:"John",
lastName: "Doe"
}
Phương thức call() có thể chấp nhận các đối số:
Hãy tự mình thử »