2012-04-08 37 views
5

Javascript: Hướng dẫn dứt khoát (2011) có ví dụ này (tr.186) không hoạt động ở chế độ nghiêm ngặt nhưng không hiển thị cách thực hiện ở chế độ nghiêm ngặt - tôi có thể nghĩ về những điều cần thử nhưng tự hỏi về thực hành tốt nhất/bảo mật/hiệu suất - cách tốt nhất để thực hiện loại điều này ở chế độ nghiêm ngặt là gì? Đây là mã:Chế độ nghiêm ngặt: Thay thế cho arguments.callee.length?

// This function uses arguments.callee, so it won't work in strict mode. 
function check(args) { 
    var actual = args.length;   // The actual number of arguments 
    var expected = args.callee.length; // The expected number of arguments 
    if (actual !== expected)   // Throw an exception if they differ. 
     throw Error("Expected " + expected + "args; got " + actual); 
} 

function f(x, y, z) { 
    check(arguments); // Check that the actual # of args matches expected #. 
    return x + y + z; // Now do the rest of the function normally. 
} 

Trả lời

3

Bạn chỉ có thể chuyển hàm bạn đang kiểm tra.

function check(args, func) { 
    var actual = args.length, 
     expected = func.length; 
    if (actual !== expected) 
     throw Error("Expected " + expected + "args; got " + actual); 
} 

function f(x, y, z) { 
    check(arguments, f); 
    return x + y + z; 
} 

Hoặc mở rộng Function.prototype nếu bạn đang ở trong một môi trường mà sẽ cho phép nó ...

Function.prototype.check = function (args) { 
    var actual = args.length, 
     expected = this.length; 
    if (actual !== expected) 
     throw Error("Expected " + expected + "args; got " + actual); 
} 

function f(x, y, z) { 
    f.check(arguments); 
    return x + y + z; 
} 

Hoặc bạn có thể thực hiện một chức năng trang trí mà trả về một chức năng mà sẽ tự động kiểm tra ...

function enforce_arg_length(_func) { 
    var expected = _func.length; 
    return function() { 
     var actual = arguments.length; 
     if (actual !== expected) 
      throw Error("Expected " + expected + "args; got " + actual); 
     return _func.apply(this, arguments); 
    }; 
} 

... và sử dụng nó như thế này ...

var f = enforce_arg_length(function(x, y, z) { 
    return x + y + z; 
}); 
+5

lý do tại sao cộng đồng wiki mọi thứ – Raynos

+1

@Raynos: Chỉ cần không quan tâm về điểm SO rep tôi đoán. Làm cho câu trả lời hấp dẫn hơn cho những người khác cũng muốn đóng góp. –

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