2012-11-27 38 views
5

Điều này có được coi là lỗi của Chrome hoặc sự khoan dung của Safari/Firefox không?Tên đóng cửa xung đột với chức năng cùng tên bên trong, nhưng chỉ trong Chrome

Khi tôi tạo chức năng đóng, tôi đặt tên tùy ý là "Nút". Trong thời gian đóng cửa, tôi có một hàm là một hàm tạo cho đối tượng chính mà việc đóng tạo ra, còn được gọi là "Nút".

Việc đóng trả về tham chiếu đến Nút, có lẽ là hàm bên trong Button().

var closure = (function Button(){ 

    //the closure's primary object 
    function Button(target) { 
     //constructor for our button object 
    } 

    Button.prototype = e.inherit(e.Plugin.prototype); 
    Button.prototype.constructor = Button; 

    return { 
      Button: Button, 
     }; 

}()); 

//now let's call our closure to create a new Button 
var newButton = new closure.Button() 

Trong Safari và Firefox, đây không phải là vấn đề. Gọi đóng mới.Button() trả về một thể hiện của nút bên trong(). Tuy nhiên, trong Chrome, khi tên hàm bên trong khớp với tên hàm đóng, hàm khởi tạo xuất hiện KHÔNG được gọi. Những gì được trả lại có vẻ là chức năng đóng cửa chính nó. Điều này, tất nhiên, dẫn đến lỗi khi hàm bên trong định nghĩa các phương thức mà sau này tôi thử và gọi.

Tôi đăng câu hỏi này vì hai lý do:

1) Tôi đã mất hơn một ngày để tìm ra nguyên nhân của vấn đề, được Chrome báo cáo rằng nút của tôi không có phương pháp .Activate (trong mã thực sự của tôi, nút kế thừa từ một đối tượng cha mẹ cung cấp phương thức .activate()). Nếu có ai khác gặp phải vấn đề này thì họ có thể tìm thấy câu hỏi của tôi ở đây và tiết kiệm thời gian.

2) Tôi tự hỏi: nếu đây là lỗi của tôi, sử dụng cùng tên cho cả việc đóng và chức năng trong quá trình đóng, tại sao nó hoạt động trong Safari/Firefox? Cụ thể hơn, liệu Chrome có thực sự làm cho việc đóng cửa trở lại chính nó và không phải là chức năng bên trong dự định? Đây có phải là một lỗi?

+6

Không repro trong Chrome: http://jsfiddle.net/77LZh/ –

+0

Tôi đã nghe nói về các vấn đề với các biểu thức hàm được đặt tên trong IE (xem [tại đây] (http://kangax.github.com/nfe/)), nhưng không phải Chrome. Và trên thực tế, thử nghiệm của @ SeanKinsey dường như chỉ hoạt động tốt trong Chrome. Điều gì làm cho bạn nghĩ rằng các nhà xây dựng không được gọi là? – bfavaretto

Trả lời

1

Có lẽ không phải là vấn đề chính xác, nhưng bạn không nhất thiết đặt tên biểu thức hàm.

var closure = (function Button(){ 

    //the closure's primary object 
    function Button(target) { 
     //constructor for our button object 
    } 

    Button.prototype = e.inherit(e.Plugin.prototype); 
    Button.prototype.constructor = Button; 

    return { 
      Button: Button, 
     }; 

}()); 
//now let's call our closure to create a new Button 
var newButton = new closure.Button() 

Nên

var closure = (function(){ 

    //the closure's primary object 
    function Button(target) { 
     //constructor for our button object 
    } 

    Button.prototype = e.inherit(e.Plugin.prototype); 
    Button.prototype.constructor = Button; 

    return { 
      Button: Button 
     }; 

}()); 

//now let's call our closure to create a new Button 
var newButton = new closure.Button(); 

Sự khác biệt là chức năng cấp cao nhất là tên. Không cần phải đặt tên cho một cái gì đó bạn sẽ không bao giờ sử dụng một lần nữa.

Ngoài ra, bạn không nên có dấu phẩy trong đối tượng trả về. Điều này sẽ xuất hiện dưới dạng lỗi cú pháp.

Ngoài ra, bạn không có dấu chấm phẩy đóng trên dòng cuối cùng.

+0

Điều này là không có sự giúp đỡ - phạm vi từ vựng của JavaScript ngăn chặn điều này là một vấn đề. Các nits liên quan đến lệnh và bán là đủ chính xác, nhưng không thận trọng cho vấn đề này. –

+0

@SeanKinsey Tôi sẽ không gọi nó là không có sự giúp đỡ. mặc dù quyền của bạn, thật khó để khắc phục vấn đề bạn không thể sao chép. Tôi chỉ cố gắng để chạy các gam màu. – dqhendricks

Các vấn đề liên quan