Определение глобальной переменной в функции 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>

Ответ 1

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

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

В качестве альтернативы вы можете назначить свойство на window:

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

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

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

Все, что сказал: я бы избегал глобальных переменных, если возможно (и вы почти наверняка сможете). Как я уже упоминал, они становятся свойствами window, а window уже достаточно много заполнены, что со всеми элементами с id (и многие с просто a 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>

Ответ 2

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

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

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

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

Ответ 3

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

var trialImage;

снаружи. Тогда

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

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

Ответ 4

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

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

Ответ 5

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

var trailimage;

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

Ответ 6

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

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

Ответ 7

    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. Мне нужно было то же самое для моего кода, и это была действительно хорошая идея.

Ответ 8

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

window.foo = 'bar';

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

;(function (root) {
    'use strict'

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

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

localStorage.foo = 42;

или

sessionStorage.bar = 21;

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

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

Ответ 9

Итак, вы хотите, чтобы переменная внутри функции была доступна вне функции? Почему бы не вернуть результаты переменной внутри функции? var x = function returnX { var x = 0; return x; } это идея...

    <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;
            return trailimage;
        }

        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>

Я не проверял это, но если ваш код работал до этого небольшого изменения, то он должен работать.

Ответ 10

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

  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

Ответ 11

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

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

makeObj();
someOtherFunction();

Ответ 12

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

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

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