Определение глобальной переменной в функции JavaScript


Можно ли определить глобальную переменную в функции JavaScript?

Я хочу использовать переменную trailimage (объявленную в функции makeObj ) в других функциях.

<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>



Answers


Да, как говорили другие, вы можете использовать var в глобальной области (вне всех функций) для объявления глобальной переменной:

<script>
var yourGlobalVariable;
function foo() {
    // ...
}
</script>

Кроме того, вы можете назначить свойство в window :

<script>
function foo() {
    window.yourGlobalVariable = ...;
}
</script>

... потому что в браузерах глобальные переменные глобальных переменных, объявленные с помощью var являются свойствами объекта window . (В последней спецификации ECMAScript 2015 новые операторы let , const и class в глобальной области создают глобальные переменные, которые не являются свойствами глобального объекта, а новая концепция в ES2015).

(Также есть ужас неявных глобалов , но не делайте это специально и делайте все возможное, чтобы избежать этого случайно, возможно, используя "use strict" ES5.)

Все, что сказало: я бы избегал глобальных переменных, если возможно (и вы почти наверняка сможете). Как я уже упоминал, они в конечном итоге являются свойствами window , и window уже достаточно многолюдно, что со всеми элементами с id (и многими с просто name ), сбрасываемыми в нем (и независимо от того, что предстоящая спецификация, IE сбрасывает практически все с name там).

Вместо этого оберните свой код в функцию определения области видимости и используйте переменные, локальные для этой функции определения области охвата, и сделайте свои другие функции закрытыми внутри:

<script>
(function() { // Begin scoping function
    var yourGlobalVariable; // Global to your code, invisible outside the scoping function
    function foo() {
        // ...
    }
})();         // End scoping function
</script>



UPDATE1: Если вы читаете комментарии, есть хорошая дискуссия вокруг этого конкретного соглашения об именах.

UPDATE2: Кажется, что, поскольку мой ответ был опубликован, соглашение об именах стало более формальным. Люди, которые учат, пишут книги и т. Д., Говорят о декларации var объявлении function .

UPDATE3: Вот дополнительная статья в википедии, которая поддерживает мою точку зрения: http://en.wikipedia.org/wiki/Declaration_(computer_programming)#Declarations_and_Definitions

... и ответить на главный вопрос. DECLARE перед вашей функцией. Это будет работать, и оно будет соответствовать хорошей практике объявления ваших переменных в верхней части области :)




Просто объявить

var trialImage;

за пределами. затем

function makeObj(address) {
    trialImage = [address, 50, 50];
..
..
}

Надеюсь это поможет.




Нет, ты не можешь. Просто объявите переменную вне функции. Вам не нужно объявлять его одновременно с назначением значения:

var trailimage;

function makeObj(address) {
  trailimage = [address, 50, 50];



Просто объявите его вне функций и назначьте значения внутри функций. Что-то вроде:

<script type="text/javascript">
    var offsetfrommouse = [10, -20];
    var displayduration = 0;
    var obj_selected = 0;
    var trailimage = null ;  // GLOBAL VARIABLE
    function makeObj(address) {
        trailimage = [address, 50, 50];  //ASSIGN VALUE

Или просто удаление «var» из вашего имени переменной внутри функции также делает его глобальным, но лучше объявить его за пределами один раз для более чистого кода. Это также будет работать:

var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;

function makeObj(address) {
    trailimage = [address, 50, 50];  //GLOBAL VARIABLE , ASSIGN VALUE

Надеюсь, что этот пример объясняет больше: http://jsfiddle.net/qCrGE/

var globalOne = 3;
testOne();

function testOne()
{
    globalOne += 2;
    alert("globalOne is : " + globalOne );
    globalOne += 1;
}

alert("outside globalOne is : " + globalOne);

testTwo();

function testTwo()
{
    globalTwo = 20;
    alert("globalTwo is " + globalTwo);
    globalTwo += 5;
}

alert("outside globalTwo is :" + globalTwo);



Очень просто определить переменную trailimage вне функции и установить ее значение в функции makeObj. Теперь вы можете получить доступ к его значению из любого места.

var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
var trailimage;
function makeObj(address) {
      trailimage = [address, 50, 50];
      ....
}



    var Global = 'Global';

    function LocalToGlobalVariable() {

    //This creates a local variable.

    var Local = '5';

    //Doing this makes the variable available for one session
    //(a page refresh - Its the session not local)

    sessionStorage.LocalToGlobalVar = Local;

    // It can be named anything as long as the sessionStorage references the local variable.
    // Otherwise it won't work
    //This refreshes the page to make the variable take effect instead of the last variable set.

    location.reload(false);
    };

    //This calls the variable outside of the function for whatever use you want.

    sessionStorage.LocalToGlobalVar;

Я понимаю, что в этом есть много синтаксических ошибок, но это общая идея ... Большое спасибо LayZee за указание на это ... Вы можете узнать, что такое локальное и сеансовое хранилище в http: //www.w3schools. com / html / html5_webstorage.asp . Мне понадобилось то же самое для моего кода, и это была действительно хорошая идея.




Вот пример кода, который может быть полезным.

  var Human = function(){
   name = "Shohanur Rahaman";  // global variable
   this.name = "Tuly"; // constructor variable 
   var age = 21;
 };

  var shohan = new Human();

 document.write(shohan.name+"<br>");
 document.write(name);
 document.write(age); // undefined cause its local variable 

Здесь я нашел хороший ответ How-can-one-declare-a-global-variable-in-JavaScript




Классический пример:

window.foo = 'bar';

Современный, безопасный пример, соответствующий лучшей практике с использованием IIFE :

;(function (root) {
    'use strict'

    root.foo = 'bar';
)(this));

В настоящее время существует также возможность использования API WebStorage

localStorage.foo = 42;

или

sessionStorage.bar = 21;

По производительности, я не уверен, что он заметно медленнее, чем хранение значений в переменных.

Широко распространенная поддержка браузера, как указано на Могу ли я использовать ...




если вы выполняете функцию запуска, вы можете определить глобальные функции и переменные таким образом:

function(globalScope)
{
     //define something
     globalScope.something() { 
         alert("It works");
     };
}(window)

Поскольку эта функция вызывается глобально с этим аргументом, это глобальная область действия здесь. Итак, что-то должно быть глобальным.




Вот еще один простой способ сделать переменную доступной в других функциях без использования глобальных переменных:

function makeObj() {
  // var trailimage = 'test';
  makeObj.trailimage = 'test';
}
function someOtherFunction() {
  document.write(makeObj.trailimage);
}

makeObj();
someOtherFunction();