Bạn đã nhấn vào một vài điều khác nhau ở đây , nhưng tôi sẽ cố gắng nhấn câu hỏi chính của bạn trước.
Nói chung ....
function() { ... }
là một biểu chức năng. Về mặt pháp lý, giá trị này ở cùng mức với 2
hoặc [4,5]
. Số này đại diện cho một giá trị . Vì vậy, việc thực hiện var foo=function(){ ... }
sẽ hoạt động theo kế hoạch, mọi lúc.
function foo() { ... }
là khai báo hàm. Điều này có vẻ tương tự như var foo=function(){...}
, nhưng có một cảnh báo nhỏ. Như một tuyên bố của nó, nó hoạt động tương tự như khái niệm về biến hoisting trong JS (về cơ bản, tất cả các khai báo biến được thực hiện trước khi bất kỳ biểu thức nào được đánh giá).
Một ví dụ điển hình là từ here:
function test() {
foo(); // TypeError "foo is not a function"
bar(); // "this will run!"
var foo = function() { // function expression assigned to local variable 'foo'
alert("this won't run!");
}
function bar() { // function declaration, given the name 'bar'
alert("this will run!");
}
}
test();
biến cơ bản cẩu đã mang lại giá trị lên đến đỉnh, do đó, mã này là tương đương (về mặt lý thuyết) tới:
function test() {
var foo;//foo hoisted to top
var bar=function(){//this as well
alert("this will run!");
}
foo(); // TypeError "foo is not a function"
bar(); // "this will run!"
var foo = function() { // function expression assigned to local variable 'foo'
alert("this won't run!");
}
}
NB: Tôi muốn lấy chỗ này để nói rằng các thông dịch viên JS có một thời gian khó theo lý thuyết, vì vậy hãy tin tưởng họ vào một số hành vi xấu xa r không được khuyến cáo.Here bạn sẽ tìm thấy một ví dụ tốt ở phần cuối của một phần mà lý thuyết và thực hành kết thúc không hoạt động (cũng có thêm một số chi tiết về chủ đề của biểu thức vs khai báo).
Fun thực tế: gói function foo() {...}
trong ngoặc biến nó từ một tuyên bố để một biểu thức, có thể dẫn đến một số mã nhìn lạ như
(function foo() { return 1; })();// 1
foo; //ReferenceError: foo is not defined
Đừng làm điều này nếu bạn không có một lý do để , xin vui lòng.
Tóm tắtvar foo=function(){ ... }
là * sorta kinda * giống như chức năng foo(){ ... }
ngoại trừ các cựu làm những gì bạn nghĩ rằng nó mà bạn nghĩ rằng nó nên trong khi sau này không những thứ kỳ lạ, trừ khi bạn quấn nó trong dấu ngoặc, nhưng điều đó làm rối loạn phạm vi và thông dịch viên JS cho phép bạn thực hiện những việc được coi là lỗi cú pháp trong thông số kỹ thuật, do đó bạn được cho là tin rằng những điều sai trái thực sự đúng, v.v.
vui lòng sử dụng chức năng biểu thức (var f=function(){...}
). Không có lý do thực sự để không, đặc biệt là xem xét bạn đang phần nào buộc phải làm điều đó khi bạn đang sử dụng cú pháp chấm.
Bật để điều thứ hai bạn chạm vào .....
Tôi không thực sự chắc chắn phải nói gì, nó kinda sorta hoàn toàn khác biệt so với mọi thứ khác về vấn đề này.
var foo = {
baz: 43,
doSomething:function() {
...
}
}
điều này được gọi là cú pháp ngữ của đối tượng. JSON, dựa trên cú pháp này, là a pretty neat way of formatting data và cú pháp này trong JS thường được sử dụng để khai báo các đối tượng mới, với các đối tượng đơn lẻ (ví dụ: tránh tất cả các mớ hỗn độn bằng cách khai báo hàm và sử dụng hàm mới). Nó cũng có thể được sử dụng trong cùng một XML cách được sử dụng, và được ưa thích bởi tất cả các trẻ em mát mẻ ...
Anyways, về cơ bản phản đối cú pháp đen làm việc như thế này:
{ name1: val1, .... namek:valk }
biểu hiện này là một đối tượng với một số giá trị được khởi tạo trên đó. do đó, hãy thực hiện var obj={ name1: val1, .... namek:valk }
có nghĩa là:
obj.name1==val1;
obj['name1']==val1;// x['y'] is the same thing as x.y
...
obj.namek==valk;
Vì vậy, điều này phải làm gì với ví dụ của chúng tôi? Về cơ bản, biểu thức của bạn thường được sử dụng để khai báo các đối tượng singleton. Nhưng nó cũng có thể được sử dụng để khai báo một nguyên mẫu đối tượng, vì vậy một người nào đó sau này có thể làm var newObj = Object.create (foo) và newObj sẽ có foo làm nguyên mẫu.
Xem xét tính kế thừa nguyên mẫu một cách chi tiết nếu bạn muốn thực sự có được mức độ hữu ích của nó. Douglas Crockford nói chi tiết về nó trong số one của nhiều cuộc nói chuyện của ông).
Phạm vi của lần đầu tiên có khác biệt với giây không? –
Đây là một bài viết hay http://kangax.github.com/nfe/ –
@amnotiam: Đồng ý. Đã bỏ phiếu để đóng. –