Hướng dẫn javascript use variable without declaring - javascript sử dụng biến mà không cần khai báo

Là "var" tùy chọn?

myObj = 1;

giống như ?

var myObj = 1;

Tôi thấy cả hai đều làm việc từ bài kiểm tra của tôi, tôi cho rằng

var myObj = 1;
3 là tùy chọn. Có đúng không?

Bartoszkp

33.9K13 Huy hiệu vàng103 Huy hiệu bạc129 Huy hiệu đồng13 gold badges103 silver badges129 bronze badges

Đã hỏi ngày 21 tháng 3 năm 2010 lúc 1:06Mar 21, 2010 at 1:06

3

Chúng có nghĩa là những điều khác nhau. Nếu bạn sử dụng

var myObj = 1;
3, biến được khai báo trong phạm vi bạn đang ở [ví dụ: của hàm]. Nếu bạn không sử dụng
var myObj = 1;
3, biến có thể bong trào qua các lớp phạm vi cho đến khi nó gặp một biến theo tên đã cho hoặc đối tượng toàn cầu [cửa sổ, nếu bạn đang thực hiện nó trong trình duyệt], sau đó nó sẽ gắn. Sau đó, nó rất giống với một biến toàn cầu. Tuy nhiên, nó vẫn có thể bị xóa với
var myObj = 1;
6 [rất có thể là bằng mã của người khác cũng không sử dụng
var myObj = 1;
3]. Nếu bạn sử dụng
var myObj = 1;
3 trong phạm vi toàn cầu, biến thực sự toàn cầu và không thể bị xóa.

Theo tôi, đây là một trong những vấn đề nguy hiểm nhất với JavaScript, và nên không được chấp nhận, hoặc ít nhất là đưa ra cảnh báo về cảnh báo. Lý do là, thật dễ dàng để quên

var myObj = 1;
3 và tình cờ có một tên biến phổ biến bị ràng buộc với đối tượng toàn cầu. Điều này tạo ra hành vi kỳ lạ và khó để gỡ lỗi.

Đã trả lời ngày 21 tháng 3 năm 2010 lúc 1:10Mar 21, 2010 at 1:10

Stefano Borinistefano BoriniStefano Borini

135K95 Huy hiệu vàng291 Huy hiệu bạc419 Huy hiệu đồng95 gold badges291 silver badges419 bronze badges

15

Đây là một trong những phần khó khăn của JavaScript, nhưng cũng là một trong những tính năng cốt lõi của nó. Một biến được tuyên bố với

var myObj = 1;
3 "bắt đầu cuộc sống của nó" ngay khi bạn tuyên bố nó. Nếu bạn rời khỏi
var myObj = 1;
3, giống như bạn đang nói về một biến mà bạn đã sử dụng trước đây.

var foo = 'first time use';
foo = 'second time use';

Liên quan đến phạm vi, không phải là các biến tự động trở thành toàn cầu. Thay vào đó, JavaScript sẽ đi qua chuỗi phạm vi để xem bạn đã sử dụng biến trước đây. Nếu nó tìm thấy một thể hiện của một biến cùng tên được sử dụng trước đó, nó sẽ sử dụng nó và bất kỳ phạm vi nào nó được khai báo. Nếu nó không gặp biến ] và sẽ gắn biến vào nó.not true that variables automatically become global. Rather, Javascript will traverse up the scope chain to see if you have used the variable before. If it finds an instance of a variable of the same name used before, it'll use that and whatever scope it was declared in. If it doesn't encounter the variable anywhere it'll eventually hit the global object [

var foo = 'first time use';
foo = 'second time use';
2 in a browser] and will attach the variable to it.

var foo = "I'm global";
var bar = "So am I";

function [] {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function [] {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}

Hành vi này thực sự mạnh mẽ khi được sử dụng với các chức năng và gọi lại lồng nhau. Tìm hiểu về

var foo = 'first time use';
foo = 'second time use';
3 là gì và phạm vi hoạt động là điều quan trọng nhất trong JavaScript.

Đã trả lời ngày 21 tháng 3 năm 2010 lúc 4:17Mar 21, 2010 at 4:17

lừa dối ♦ lừa dốideceze

499K81 Huy hiệu vàng720 Huy hiệu bạc868 Huy hiệu Đồng81 gold badges720 silver badges868 bronze badges

8

Không, họ không tương đương.

Với

var foo = 'first time use';
foo = 'second time use';
4, bạn đang sử dụng biến toàn cầu.

Tuyên bố thứ hai tạo ra một biến cục bộ cho phạm vi bạn đang sử dụng.

Hãy thử mã sau để hiểu sự khác biệt:

external = 5;
function firsttry[] {
  var external = 6;
  alert["first Try: " + external];
}

function secondtry[] {
  external = 7;
  alert["second Try: " + external];
}

alert[external]; // Prints 5
firsttry[]; // Prints 6
alert[external]; // Prints 5
secondtry[]; // Prints 7
alert[external]; // Prints 7

Hàm thứ hai làm thay đổi giá trị của biến toàn cầu "bên ngoài", nhưng hàm thứ nhất thì không.

lietus

1992 Huy hiệu bạc11 Huy hiệu đồng2 silver badges11 bronze badges

Đã trả lời ngày 21 tháng 3 năm 2010 lúc 1:16Mar 21, 2010 at 1:16

EinekieinekiEineki

Phù bằng vàng 14.6K651 Huy hiệu bạc58 Huy hiệu đồng6 gold badges51 silver badges58 bronze badges

1

Có nhiều hơn một chút so với chỉ là địa phương so với toàn cầu. Các biến toàn cầu được tạo bằng

var myObj = 1;
3 khác với các biến được tạo ra mà không có. Xem xét điều này:

var foo = 1; // declared properly
bar = 2; // implied global
window.baz = 3; // global via window object

Dựa trên các câu trả lời cho đến nay, các biến toàn cầu này,

var foo = 'first time use';
foo = 'second time use';
6,
var foo = 'first time use';
foo = 'second time use';
7 và
var foo = 'first time use';
foo = 'second time use';
8 đều tương đương. Đây không phải là trường hợp. Các biến toàn cầu được thực hiện bằng
var myObj = 1;
3 [chính xác] được gán thuộc tính
var foo = "I'm global";
var bar = "So am I";

function [] {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function [] {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}
0 nội bộ, do đó chúng không thể bị xóa.not the case. Global variables made with
var myObj = 1;
3 are [correctly] assigned the internal
var foo = "I'm global";
var bar = "So am I";

function [] {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function [] {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}
0 property, such that they cannot be deleted.

delete foo; // false
delete bar; // true
delete baz; // true

foo; // 1
bar; // ReferenceError
baz; // ReferenceError

Đây là lý do tại sao bạn phải luôn luôn sử dụng

var myObj = 1;
3, ngay cả đối với các biến toàn cầu.always use
var myObj = 1;
3, even for global variables.

Đã trả lời ngày 21 tháng 3 năm 2010 lúc 2:54Mar 21, 2010 at 2:54

Bcherrybcherrybcherry

7.0922 Huy hiệu vàng27 Huy hiệu bạc37 Huy hiệu đồng2 gold badges27 silver badges37 bronze badges

1

Có rất nhiều sự nhầm lẫn xung quanh chủ đề này, và không có câu trả lời nào hiện có bao gồm mọi thứ rõ ràng và trực tiếp. Dưới đây là một số ví dụ với ý kiến ​​nội tuyến.

//this is a declaration
var foo;

//this is an assignment
bar = 3;

//this is a declaration and an assignment
var dual = 5;

Một tuyên bố đặt một lá cờ dontdelete. Một bài tập không.

Một tuyên bố liên kết biến đó với phạm vi hiện tại.

Một biến được gán nhưng không được tuyên bố sẽ tìm kiếm một phạm vi để tự đính kèm. Điều đó có nghĩa là nó sẽ đi qua chuỗi thực phẩm của phạm vi cho đến khi một biến có cùng tên được tìm thấy. Nếu không tìm thấy, nó sẽ được gắn vào phạm vi cấp cao nhất [thường được gọi là toàn cầu].

function example[]{
  //is a member of the scope defined by the function example
  var foo;

  //this function is also part of the scope of the function example
  var bar = function[]{
     foo = 12; // traverses scope and assigns example.foo to 12
  }
}

function something_different[]{
     foo = 15; // traverses scope and assigns global.foo to 15
}

Đối với một mô tả rất rõ ràng về những gì đang xảy ra, phân tích này về chức năng xóa bao gồm sự khởi tạo và gán biến đổi rộng rãi.

Đã trả lời ngày 13 tháng 4 năm 2013 lúc 12:53Apr 13, 2013 at 12:53

Steve Kallestadsteve KallestadSteve Kallestad

3,4042 Huy hiệu vàng21 Huy hiệu bạc31 Huy hiệu đồng2 gold badges21 silver badges31 bronze badges

2

var myObj = 1;
3 là tùy chọn.
var myObj = 1;
3 đặt một biến trong phạm vi cục bộ. Nếu một biến được xác định mà không có
var myObj = 1;
3, thì nó nằm trong phạm vi toàn cầu và không thể loại bỏ.

chỉnh sửa

Tôi nghĩ rằng phần không thể giải quyết được là đúng vào một thời điểm với một môi trường nhất định. Tôi phải mơ nó.

Đã trả lời ngày 21 tháng 3 năm 2010 lúc 1:12Mar 21, 2010 at 1:12

KZHKZHkzh

19.2K12 Huy hiệu vàng71 Huy hiệu bạc96 Huy hiệu đồng12 gold badges71 silver badges96 bronze badges

1

Kiểm tra fiddle này: //jsfiddle.net/gwr6z/2/

function doMe[]{

a = "123"; // will be global
var b = "321"; // local to doMe
alert["a:"+a+"  --  b:"+b];

b = "something else"; // still local [not global]
alert["a:"+a+"  --  b:"+b];

};


doMe[]
alert["a:"+a+"  --  b:"+b]; // `b` will not be defined, check console.log

Đã trả lời ngày 10 tháng 6 năm 2014 lúc 18:23Jun 10, 2014 at 18:23

Người đàn ông sữaMilk Man

1.25813 huy hiệu bạc21 Huy hiệu đồng13 silver badges21 bronze badges

2

Chúng không giống nhau.

Biến không được khai báo [không có

var myObj = 1;
3] được coi là thuộc tính của đối tượng toàn cầu. [Thường là đối tượng
var foo = 'first time use';
foo = 'second time use';
2, trừ khi bạn đang ở trong khối
var foo = "I'm global";
var bar = "So am I";

function [] {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function [] {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}
7]

Các biến được khai báo với

var myObj = 1;
3 là các biến cục bộ bình thường và không hiển thị bên ngoài hàm mà chúng được khai báo. [Lưu ý rằng JavaScript không có phạm vi khối]

Cập nhật: Ecmascript 2015

var foo = "I'm global";
var bar = "So am I";

function [] {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function [] {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}
9 đã được giới thiệu trong Ecmascript 2015 để có phạm vi khối.have block scope.

Dexter

3.6463 Huy hiệu vàng43 Huy hiệu bạc54 Huy hiệu đồng3 gold badges43 silver badges54 bronze badges

Đã trả lời ngày 21 tháng 3 năm 2010 lúc 1:10Mar 21, 2010 at 1:10

SlaksslaksSLaks

851K174 Huy hiệu vàng1881 Huy hiệu bạc1949 Huy hiệu đồng174 gold badges1881 silver badges1949 bronze badges

0

Từ khóa VAR trong JavaScript là có cho một mục đích.

Nếu bạn khai báo một biến mà không có từ khóa VAR, như thế này:

var myObj = 1;
0

Nó trở thành một biến toàn cầu có thể được truy cập từ bất kỳ phần nào trong tập lệnh của bạn. Nếu bạn không cố ý làm điều đó hoặc không biết về nó, nó có thể gây đau nếu bạn sử dụng lại tên biến ở một nơi khác trong JavaScript của bạn.

Nếu bạn khai báo biến với từ khóa VAR, như thế này:

var myObj = 1;
1

Nó là cục bộ của phạm vi [{] - niềng răng, chức năng, tệp, tùy thuộc vào nơi bạn đặt nó].

Đây là một cách an toàn hơn để điều trị các biến số. Vì vậy, trừ khi bạn đang thực hiện nó trên mục đích, hãy cố gắng khai báo biến với từ khóa VAR chứ không phải không có.

Đã trả lời ngày 21 tháng 3 năm 2010 lúc 1:16Mar 21, 2010 at 1:16

Cyril Guptacyril GuptaCyril Gupta

13.3k11 Huy hiệu vàng64 Huy hiệu bạc84 Huy hiệu đồng11 gold badges64 silver badges84 bronze badges

2

Hãy xem xét câu hỏi này được hỏi tại Stackoverflow hôm nay:

Câu hỏi JavaScript đơn giản

Một thử nghiệm tốt và một ví dụ thực tế là những gì xảy ra trong kịch bản trên ... nhà phát triển đã sử dụng tên của hàm JavaScript trong một trong các biến của mình.practical example is what happens in the above scenario...
The developer used the name of the JavaScript function in one of his variables.

Vấn đề với mã là gì? Mã chỉ hoạt động ngay lần đầu tiên người dùng nhấp vào nút.
The code only works the first time the user clicks the button.

Giải pháp là gì? Thêm từ khóa

var myObj = 1;
3 trước tên biến.
Add the
var myObj = 1;
3 keyword before the variable name.

Đã trả lời ngày 21 tháng 3 năm 2010 lúc 1:30Mar 21, 2010 at 1:30

Leniel Maccaferrileniel MaccaferriLeniel Maccaferri

98.2K44 Huy hiệu vàng361 Huy hiệu bạc464 Huy hiệu đồng44 gold badges361 silver badges464 bronze badges

VAR không cho phép bạn, lập trình viên, khai báo một biến vì JavaScript không có biến. JavaScript có các đối tượng. VAR tuyên bố một tên cho một đối tượng không xác định, rõ ràng. Nhiệm vụ gán một tên làm tay cầm cho một đối tượng đã được cung cấp một giá trị.

Sử dụng VAR cho biết thông tin Javacript hai điều:

  1. không sử dụng giá trị tra cứu ngược của đại biểu cho tên, thay vào đó hãy sử dụng cái này delegation reverse traversal look up value for the name, instead use this one
  2. không xóa tên the name

Bỏ sót của VAR cho người thông dịch Javacript sử dụng phiên bản trước được tìm thấy đầu tiên của một đối tượng có cùng tên.

VAR như một từ khóa phát sinh từ một quyết định kém của nhà thiết kế ngôn ngữ giống như cách mà JavaScript như một cái tên phát sinh từ một quyết định kém.

PS. Nghiên cứu các ví dụ mã ở trên.

Đã trả lời ngày 24 tháng 10 năm 2013 lúc 19:25Oct 24, 2013 at 19:25

Tất cả mọi thứ về phạm vi sang một bên, chúng có thể được sử dụng khác nhau.

var myObj = 1;
2

Một cái gì đó một cái gì đó tuyên bố vs biểu thức

Đã trả lời ngày 15 tháng 7 năm 2015 lúc 1:33Jul 15, 2015 at 1:33

CodebleDcodeBlingCodebling

10,4K2 Huy hiệu vàng34 Huy hiệu bạc61 Huy hiệu Đồng2 gold badges34 silver badges61 bronze badges

Không, nó không phải là "bắt buộc", nhưng nó cũng có thể là nó có thể gây ra các vấn đề lớn nếu bạn không. Không xác định một biến với var đặt biến đó bên trong phạm vi của một phần của mã. của chức năng bạn đang ở.

Đã trả lời ngày 18 tháng 11 năm 2015 lúc 16:48Nov 18, 2015 at 16:48

Chúng ta có thể sử dụng một biến mà không cần khai báo không?

Một biến không thể được sử dụng trong một chương trình trừ khi nó đã được khai báo..

Điều gì xảy ra nếu bạn không khai báo biến trong JavaScript?

Nếu bạn không tuyên bố một biến một cách rõ ràng, JavaScript sẽ tuyên bố nó ngầm cho bạn.JavaScript will declare it implicitly for you.

Bài Viết Liên Quan

Chủ Đề