Javascript 如何在jquery中使用来自另一个函数的变量

Javascript 如何在jquery中使用来自另一个函数的变量,javascript,jquery,oop,function,Javascript,Jquery,Oop,Function,这是我函数的一个基本版本(我第一次这么做,所以如果我没有很好地解释,我很抱歉) 因此,这个想法是skillsbtn=$(this)参考$(this)位于主页:函数中的任何内容。我尝试将变量从home:function复制到work:function,效果很好。但是我可以把我需要的变量放在init:function中,但是可以在home:function中调用它们,通过这样做,可以改变$(this)是什么意思,也就是说这个->主页,或者这个->工作 我试着像pages.init.skillsbtn

这是我函数的一个基本版本(我第一次这么做,所以如果我没有很好地解释,我很抱歉)

因此,这个想法是skillsbtn=
$(this)
参考
$(this)
位于
主页:函数中的任何内容。我尝试将变量从
home:function
复制到
work:function
,效果很好。但是我可以把我需要的变量放在
init:function
中,但是可以在
home:function
中调用它们,通过这样做,可以改变
$(this)
是什么意思,也就是说这个->主页,或者这个->工作

我试着像pages.init.skillsbtn.call(this)
那样访问它,但它不起作用

希望你能帮忙
-谢谢

在函数外部声明变量并在函数内部赋值,从而使变量成为全局变量

var globalVar,
    pages = {
    init:function(){

    },
    home:function(){

        articleid = this.closest("article").attr('id');
        skillsbtn =  $(this).hasClass("skillsbt");
        home = $('#home');
        homeheight = '-' + home.height();

    if (skillsbtn && articleid == "home"){
        home.animate({"marginTop"   : homeheight},800);
    }
},
    work:function(){
//same variables are requred here: skillsbtn =  $(this).hasClass("skillsbt");...
    },
    skills:function(){
//same variables are requred here: skillsbtn =  $(this).hasClass("skillsbt");...
    },
    contact:function(){

    },
}

然后将您想要使用的任何内容分配给全局变量

通过在函数外部声明变量并在函数内部分配变量,使变量成为全局变量

var globalVar,
    pages = {
    init:function(){

    },
    home:function(){

        articleid = this.closest("article").attr('id');
        skillsbtn =  $(this).hasClass("skillsbt");
        home = $('#home');
        homeheight = '-' + home.height();

    if (skillsbtn && articleid == "home"){
        home.animate({"marginTop"   : homeheight},800);
    }
},
    work:function(){
//same variables are requred here: skillsbtn =  $(this).hasClass("skillsbt");...
    },
    skills:function(){
//same variables are requred here: skillsbtn =  $(this).hasClass("skillsbt");...
    },
    contact:function(){

    },
}

然后将您想要使用的任何变量分配给全局变量

创建另一个对象,该对象包含您需要在全局范围内的变量,并将其用作存储库。试试这个:

var pages = {
    init: function() {
    },
    settings: {
        skillsButton: "test"
    },
    home: function() {
        this.settings.skillsButton = "value changed in 'home'";
    }
}
然后,您可以在任何需要的地方参考
settings.skillsButton


创建另一个对象,该对象包含全局范围内所需的变量,并将其用作存储库。试试这个:

var pages = {
    init: function() {
    },
    settings: {
        skillsButton: "test"
    },
    home: function() {
        this.settings.skillsButton = "value changed in 'home'";
    }
}
然后,您可以在任何需要的地方参考
settings.skillsButton


您在所有地方都使用全局变量(在
home
函数的前四个赋值之前,
var
在哪里

您想共享状态,但不为此使用对象?这就是他们的目的。 什么是页面?如果它是某种类型的“存储库”或“命名空间”,可以使用大写名称来区分它不是普通实例

由于jQuery事件中的
this
绑定到事件源,因此不能简单地使用
this
,但可以这样做:

var Pages = {
    init:function(){
      Pages.worker = new PagesWorker;
      // later if you see fit you can have more of these
    },
    home:function(){
      return Pages.worker.home($(this));
    },
    work:function(){
      return Pages.worker.work($(this));
    },
    skills:function(){
      return Pages.worker.skills($(this));
    },
    contact:function(){
      return Pages.worker.contact($(this));
    },
}

function PagesWorker(src){
  // init
}

PagesWorker.prototype.home = function(src){

    // use var xxx = yyy for ones local for this function only
    // use this.xxx = yyy for those that should persist between functions   
    var articleid = src.closest("article").attr('id');
    this.skillsbtn =  src.hasClass("skillsbt");
    var home = $('#home');
    var homeheight = '-' + home.height();

    if (this.skillsbtn && articleid == "home"){
        home.animate({"marginTop"   : homeheight},800);
    }
};

PagesWorker.prototype.work = function(src){
  //same variables are requred here: skillsbtn etc.
  //no problem, use this.skillsbtn etc.
};

PagesWorker.prototype.skills = function(src){
  //same variables are requred here: skillsbtn etc.
  //no problem, use this.skillsbtn etc.
};

PagesWorker.prototype.contact = function(src){
  //same variables are requred here: skillsbtn etc.
  //no problem, use this.skillsbtn etc.
};

如果确实确定只有一个pages对象,则可以使用pages.xxx在函数调用和原始代码之间共享变量。但这不是正确的做法,除非你真的非常确定。

你到处使用全局变量(在
home
函数的前四个赋值之前,
var
在哪里)

您想共享状态,但不为此使用对象?这就是他们的目的。 什么是页面?如果它是某种类型的“存储库”或“命名空间”,可以使用大写名称来区分它不是普通实例

由于jQuery事件中的
this
绑定到事件源,因此不能简单地使用
this
,但可以这样做:

var Pages = {
    init:function(){
      Pages.worker = new PagesWorker;
      // later if you see fit you can have more of these
    },
    home:function(){
      return Pages.worker.home($(this));
    },
    work:function(){
      return Pages.worker.work($(this));
    },
    skills:function(){
      return Pages.worker.skills($(this));
    },
    contact:function(){
      return Pages.worker.contact($(this));
    },
}

function PagesWorker(src){
  // init
}

PagesWorker.prototype.home = function(src){

    // use var xxx = yyy for ones local for this function only
    // use this.xxx = yyy for those that should persist between functions   
    var articleid = src.closest("article").attr('id');
    this.skillsbtn =  src.hasClass("skillsbt");
    var home = $('#home');
    var homeheight = '-' + home.height();

    if (this.skillsbtn && articleid == "home"){
        home.animate({"marginTop"   : homeheight},800);
    }
};

PagesWorker.prototype.work = function(src){
  //same variables are requred here: skillsbtn etc.
  //no problem, use this.skillsbtn etc.
};

PagesWorker.prototype.skills = function(src){
  //same variables are requred here: skillsbtn etc.
  //no problem, use this.skillsbtn etc.
};

PagesWorker.prototype.contact = function(src){
  //same variables are requred here: skillsbtn etc.
  //no problem, use this.skillsbtn etc.
};

如果确实确定只有一个pages对象,则可以使用pages.xxx在函数调用和原始代码之间共享变量。但是,除非你真的非常确定,否则这不是正确的做法。

他在这里会有问题,因为在我看来,这是他的代码中的DOM元素。他在这里会有问题,因为在我看来,这是他的代码中的DOM元素通过实践和教程学习,或者我需要阅读任何背景信息吗?为了擅长这一点,我认为练习是不够的,如果没有某种指导,你会学到很多“黑客”和“捷径”。如果你知道你想要什么,复制粘贴修改就可以了,但这不是一个长期的学习过程。你应该读一些书,或者读一些好的博客(虽然我不知道适合初学者的好博客;我在www.c2.com或www.martinfowler.com感觉不错,但这些都是关于更高层次的——但毕竟,设计才是最重要的,程序(以及编写它的语言)只是一个实现——如果你的设计不好,即使Smalltalk也帮不了你。所有这些(编程)可以通过实践和教程学习吗?或者我需要阅读任何背景信息吗?为了擅长这一点,我认为练习是不够的,如果没有某种指导,你会学到很多“黑客”和“捷径”。如果你知道你想要什么,复制粘贴修改就可以了,但这不是一个长期的学习过程。你应该读一些书,或者读一些好的博客(虽然我不知道适合初学者的好博客;我在www.c2.com或www.martinfowler.com感觉不错,但这些都是关于更高层次的——但毕竟,设计才是最重要的,程序(以及编写它的语言)只是一个实现——如果你的设计不好,即使Smalltalk也帮不了你)。