Apakah mungkin untuk mendefinisikan variabel global dalam fungsi JavaScript?
Saya ingin menggunakan trailimage
variabel (dideklarasikan dalam makeObj
fungsi) di fungsi lain.
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script type="text/javascript">
var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
function makeObj(address) {
**var trailimage = [address, 50, 50];**
document.write('<img id="trailimageid" src="' + trailimage[0] + '" border="0" style=" position: absolute; visibility:visible; left: 0px; top: 0px; width: ' + trailimage[1] + 'px; height: ' + trailimage[2] + 'px">');
obj_selected = 1;
}
function truebody() {
return (!window.opera && document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
}
function hidetrail() {
var x = document.getElementById("trailimageid").style;
x.visibility = "hidden";
document.onmousemove = "";
}
function followmouse(e) {
var xcoord = offsetfrommouse[0];
var ycoord = offsetfrommouse[1];
var x = document.getElementById("trailimageid").style;
if (typeof e != "undefined") {
xcoord += e.pageX;
ycoord += e.pageY;
}
else if (typeof window.event != "undefined") {
xcoord += truebody().scrollLeft + event.clientX;
ycoord += truebody().scrollTop + event.clientY;
}
var docwidth = 1395;
var docheight = 676;
if (xcoord + trailimage[1] + 3 > docwidth || ycoord + trailimage[2] > docheight) {
x.display = "none";
alert("inja");
}
else
x.display = "";
x.left = xcoord + "px";
x.top = ycoord + "px";
}
if (obj_selected = 1) {
alert("obj_selected = true");
document.onmousemove = followmouse;
if (displayduration > 0)
setTimeout("hidetrail()", displayduration * 1000);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<img alt="" id="house" src="Pictures/sides/right.gif" style="z-index: 1; left: 372px;
top: 219px; position: absolute; height: 138px; width: 120px" onclick="javascript:makeObj('Pictures/sides/sides-not-clicked.gif');" />
</form>
</body>
</html>
var
tidak mendeklarasikan variabel global. Konsekuensi dari penetapan nilai ke variabel yang tidak dideklarasikan adalah pembuatan properti pada objek global, yang sangat berbeda dengan mendeklarasikan variabel.Jawaban:
Ya, seperti yang dikatakan orang lain, Anda dapat menggunakan
var
di lingkup global (di luar semua fungsi) untuk mendeklarasikan variabel global:Sebagai alternatif, Anda dapat menetapkan untuk sebuah properti di
window
:... karena di browser,
semua variabelglobal yang dideklarasikan denganvariabelglobalvar
adalah propertiwindow
objek. (Dalam spesifikasi terbaru, ECMAScript 2015, barulet
,const
danclass
pernyataan di lingkup global membuat global yang bukan properti dari objek global; konsep baru dalam ES2015.)(Ada juga ketakutan global yang tersirat , tetapi jangan lakukan itu dengan sengaja dan lakukan yang terbaik untuk menghindari melakukannya secara tidak sengaja, mungkin dengan menggunakan ES5
"use strict"
.)Semua itu mengatakan: Saya akan menghindari variabel global jika Anda bisa (dan Anda hampir pasti bisa). Seperti yang saya sebutkan, mereka akhirnya menjadi properti
window
, danwindow
sudah cukup ramai apa dengan semua elemen denganid
(dan banyak hanya denganname
) dibuang di dalamnya (dan terlepas dari spesifikasi yang akan datang, IE kesedihan apa saja denganname
ada di sana ).Alih-alih, bungkus kode Anda dalam fungsi pelingkupan dan gunakan variabel lokal untuk fungsi pelingkupan itu, dan tutuplah fungsi-fungsi Anda yang lain di dalamnya:
sumber
window
tidak akan berfungsi di Node. Trik termudah di sini adalah mengatur:GLOBAL.window = GLOBAL;
- seperti yang dijelaskan dalam pertanyaan terkait ini . Tentu saja, itu tidak cantik secara konseptual. Saya lebih suka melakukan hal-hal di sekitar jalan lain, sehingga saya dapat menggunakanGLOBAL
bukanwindow
.window.yourGlobalVariable = ...;
bekerja seperti pesona setelah membaca 5 hingga 6 pertanyaan di situs tumpukan.eval
sana. Sebagai gantinya:window[dynamic_variable_name] = dynamic_variable_value;
UPDATE1: Jika Anda membaca komentar ada diskusi yang bagus di sekitar konvensi penamaan khusus ini.
UPDATE2: Sepertinya jawaban saya telah diposting konvensi penamaan menjadi lebih formal. Orang yang mengajar, menulis buku dll berbicara tentang
var
deklarasi, danfunction
deklarasi.UPDATE3: Ini adalah posting wikipedia tambahan yang mendukung maksud saya: http://en.wikipedia.org/wiki/Declaration_(computer_programming)#Declarations_and_Definitions
... dan untuk menjawab pertanyaan utama. DECLARE variabel sebelum fungsi Anda. Ini akan berhasil dan akan mematuhi praktik yang baik dalam mendeklarasikan variabel Anda di bagian atas lingkup :)
sumber
definition
dandeclaration
artinya di C. Baris pertama Anda bisa berupa deklarasi atau definisi (tergantung di mana tempatnya); yang kedua hanyalah tugas. Deklarasi hanya menentukan interpretasi pengidentifikasi (mis.myVar
Adalah anint
); jika deklarasi juga menyimpan cadangan, itu adalah adefinition
. Ini tidak terkait dengan mengetik; itu adalah bagian dari bagaimana unit kompilasi memahami referensi ke unit kompilasi lainnya.var myVar
disebut deklarasi (tidak perlu diketik) danmyVar = 10
sebuah tugas . Saya pernah mendengar istilah "defintion" untuk senyawa (var myVar = 10;
).Nyatakan saja
di luar. Kemudian
Semoga ini membantu.
sumber
Tidak bisa. Cukup deklarasikan variabel di luar fungsi. Anda tidak harus mendeklarasikannya secara bersamaan saat Anda menetapkan nilainya:
sumber
window
adalah sama. Either way, perbedaan semantik yang Anda buat jelas, jadi saya tidak keberatan un-downvoting. Sunting: tidak dapat mengubah suara saya, maaf!var
, itulah yang Guffa maksudkan dengan secara implisit menciptakan (seperti @DhruvPathak menunjuk ke sana, juga).Hanya mendeklarasikannya di luar fungsi, dan menetapkan nilai di dalam fungsi. Sesuatu seperti:
Atau hanya menghapus "var" dari nama variabel Anda di dalam fungsi juga membuatnya global, tetapi lebih baik untuk mendeklarasikannya di luar sekali untuk kode pembersih. Ini juga akan berfungsi:
Saya harap contoh ini menjelaskan lebih lanjut: http://jsfiddle.net/qCrGE/
sumber
Sangat mudah mendefinisikan variabel trailimage di luar fungsi dan menetapkan nilainya dalam fungsi makeObj. Sekarang Anda dapat mengakses nilainya dari mana saja.
sumber
Saya menyadari mungkin ada banyak kesalahan sintaksis dalam hal ini tetapi ini adalah ide umum ... Terima kasih banyak LayZee untuk menunjukkan ini ... Anda dapat menemukan apa Penyimpanan lokal dan sesi adalah di http: //www.w3schools. com / html / html5_webstorage.asp . Saya memerlukan hal yang sama untuk kode saya dan ini adalah ide yang sangat bagus.
sumber
location.reload(false);
menyegarkan halaman berulang kali.Contoh klasik:
Contoh modern dan aman yang mengikuti praktik terbaik dengan menggunakan IIFE :
Saat ini, ada juga opsi untuk menggunakan WebStorage API
atau
Performancewise, saya tidak yakin apakah itu terasa lebih lambat daripada menyimpan nilai dalam variabel.
Dukungan peramban yang luas seperti yang disebutkan pada Dapatkah saya menggunakan ...
sumber
localStorage.foo = JSON.stringify({ arbitrary: 'object', meaning: 42, awesome: true });
danvar foo = JSON.decode(localStorage.foo);
.localStorage
harus dilakukan dengan variabel global?Jadi Anda ingin variabel di dalam fungsi tersedia di luar fungsi? Mengapa tidak mengembalikan hasil variabel di dalam fungsi?
var x = function returnX { var x = 0; return x; }
adalah idenya ...Saya belum menguji ini, tetapi jika kode Anda berfungsi sebelum perubahan kecil itu, maka itu harus bekerja.
sumber
Berikut adalah contoh kode yang mungkin dapat membantu.
Di sini saya menemukan jawaban yang bagus Bagaimana-bisa-satu-menyatakan-global-variabel-dalam-JavaScript
sumber
Berikut adalah metode mudah lain untuk membuat variabel tersedia di fungsi lain tanpa harus menggunakan variabel global:
sumber
jika Anda membuat fungsi startup, Anda dapat mendefinisikan fungsi dan variabel global sedemikian rupa:
Karena fungsi dipanggil secara global dengan argumen ini, ini adalah ruang lingkup global di sini. Jadi, sesuatu itu harus menjadi hal global.
sumber
this
adalahundefined
dalam mode luar ketat fungsi dan tidak boleh digunakan untuk merujuk pada objek global.